BfAst.h 89 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685
  1. #pragma once
  2. #include "BeefySysLib/Common.h"
  3. #include "BeefySysLib/util/DLIList.h"
  4. #include "BeefySysLib/util/BumpAllocator.h"
  5. #include "BeefySysLib/util/SizedArray.h"
  6. #include "BfAstAllocator.h"
  7. #include "BfIRBuilder.h"
  8. //#define BF_AST_HAS_PARENT_MEMBER
  9. //#define BF_AST_COMPACT
  10. //#define BF_AST_VTABLE
  11. #ifdef _DEBUG
  12. #define BF_AST_VTABLE
  13. #endif
  14. /*#pragma warning(push)
  15. #pragma warning(disable:4141)
  16. #pragma warning(disable:4624)
  17. #pragma warning(disable:4996)
  18. #pragma warning(disable:4267)
  19. #pragma warning(disable:4291)
  20. #pragma warning(disable:4267)
  21. #pragma warning(disable:4141)
  22. #pragma warning(disable:4146)
  23. #include "llvm/Support/raw_ostream.h"
  24. #include "llvm/ADT/SmallVector.h"
  25. #pragma warning(pop)*/
  26. namespace llvm
  27. {
  28. class Value;
  29. };
  30. NS_BF_BEGIN
  31. class BfType;
  32. class BfParser;
  33. class BfSource;
  34. class BfAstNode;
  35. class BfTokenNode;
  36. class BfTokenPairNode;
  37. class BfUsingSpecifierNode;
  38. class BfTypeReference;
  39. class BfTypeDef;
  40. class BfMethodDef;
  41. class BfFieldDef;
  42. class BfSystem;
  43. class BfMethodInstance;
  44. class BfPassInstance;
  45. enum BfProtection : uint8
  46. {
  47. BfProtection_Disable,
  48. BfProtection_Hidden,
  49. BfProtection_Private,
  50. BfProtection_Internal,
  51. BfProtection_Protected,
  52. BfProtection_ProtectedInternal,
  53. BfProtection_Public,
  54. BfProtection_COUNT
  55. };
  56. enum BfCheckedKind : int8
  57. {
  58. BfCheckedKind_NotSet,
  59. BfCheckedKind_Checked,
  60. BfCheckedKind_Unchecked
  61. };
  62. static bool CheckProtection(BfProtection protection, bool allowProtected, bool allowPrivate)
  63. {
  64. return (protection == BfProtection_Public) ||
  65. ((protection == BfProtection_Protected) && (allowProtected)) ||
  66. ((protection == BfProtection_Private) && (allowPrivate));
  67. }
  68. struct BfVariant
  69. {
  70. struct StructData
  71. {
  72. int mSize;
  73. uint8 mData[1];
  74. };
  75. BfTypeCode mTypeCode;
  76. int mWarnType;
  77. union
  78. {
  79. bool mBool;
  80. int8 mInt8;
  81. uint8 mUInt8;
  82. int16 mInt16;
  83. uint16 mUInt16;
  84. int32 mInt32;
  85. uint32 mUInt32;
  86. int64 mInt64;
  87. uint64 mUInt64;
  88. float mSingle;
  89. double mDouble;
  90. String* mString;
  91. void* mPtr;
  92. };
  93. double ToDouble()
  94. {
  95. if (mTypeCode == BfTypeCode_Double)
  96. return mDouble;
  97. if (mTypeCode == BfTypeCode_Float)
  98. return mSingle;
  99. return (double)mInt64;
  100. }
  101. BfVariant()
  102. {
  103. mTypeCode = BfTypeCode_None;
  104. mWarnType = 0;
  105. mUInt64 = 0;
  106. }
  107. BfVariant(const BfVariant& variant)
  108. {
  109. mTypeCode = BfTypeCode_None;
  110. mWarnType = 0;
  111. mUInt64 = 0;
  112. *this = variant;
  113. }
  114. BfVariant(BfVariant&& variant)
  115. {
  116. mTypeCode = variant.mTypeCode;
  117. mWarnType = variant.mWarnType;
  118. mUInt64 = variant.mUInt64;
  119. variant.mTypeCode = BfTypeCode_None;
  120. }
  121. ~BfVariant()
  122. {
  123. if (mTypeCode == BfTypeCode_Struct)
  124. delete [] (uint8*)mPtr;
  125. }
  126. BfVariant& operator=(const BfVariant& variant)
  127. {
  128. if (mTypeCode == BfTypeCode_Struct)
  129. delete [] (uint8*)mPtr;
  130. mTypeCode = variant.mTypeCode;
  131. mWarnType = variant.mWarnType;
  132. mUInt64 = variant.mUInt64;
  133. if (variant.mTypeCode == BfTypeCode_Struct)
  134. {
  135. StructData* srcStructData = (StructData*)mPtr;
  136. StructData* destStructData = (StructData*)(new uint8[srcStructData->mSize + 4]);
  137. destStructData->mSize = srcStructData->mSize;
  138. memcpy(destStructData->mData, srcStructData->mData, destStructData->mSize);
  139. mPtr = destStructData;
  140. }
  141. return *this;
  142. }
  143. bool operator==(const BfVariant& variant) const
  144. {
  145. if (mTypeCode != variant.mTypeCode)
  146. return false;
  147. if (mTypeCode == BfTypeCode_Struct)
  148. {
  149. StructData* structDataA = (StructData*)mPtr;
  150. StructData* structDataB = (StructData*)variant.mPtr;
  151. if (structDataA->mSize != structDataB->mSize)
  152. return false;
  153. return memcmp(structDataA->mData, structDataB->mData, structDataA->mSize) == 0;
  154. }
  155. return mUInt64 == variant.mUInt64;
  156. }
  157. };
  158. enum BfToken : uint8
  159. {
  160. BfToken_None,
  161. BfToken_Abstract,
  162. BfToken_AlignOf,
  163. BfToken_AllocType,
  164. BfToken_Append,
  165. BfToken_As,
  166. BfToken_Asm,
  167. BfToken_AsmNewline,
  168. BfToken_Base,
  169. BfToken_Box,
  170. BfToken_Break,
  171. BfToken_Case,
  172. BfToken_Catch,
  173. BfToken_Checked,
  174. BfToken_Class,
  175. BfToken_Comptype,
  176. BfToken_Concrete,
  177. BfToken_Const,
  178. BfToken_Continue,
  179. BfToken_Decltype,
  180. BfToken_Default,
  181. BfToken_Defer,
  182. BfToken_Delegate,
  183. BfToken_Delete,
  184. BfToken_Do,
  185. BfToken_Else,
  186. BfToken_Enum,
  187. BfToken_Explicit,
  188. BfToken_Extern,
  189. BfToken_Extension,
  190. BfToken_Fallthrough,
  191. BfToken_Finally,
  192. BfToken_Fixed,
  193. BfToken_For,
  194. BfToken_Function,
  195. BfToken_Goto,
  196. BfToken_If,
  197. BfToken_Implicit,
  198. BfToken_In,
  199. BfToken_Inline,
  200. BfToken_Interface,
  201. BfToken_Internal,
  202. BfToken_Is,
  203. BfToken_IsConst,
  204. BfToken_Let,
  205. BfToken_Mixin,
  206. BfToken_Mut,
  207. BfToken_NameOf,
  208. BfToken_Namespace,
  209. BfToken_New,
  210. BfToken_Not,
  211. BfToken_Null,
  212. BfToken_Nullable,
  213. BfToken_OffsetOf,
  214. BfToken_Operator,
  215. BfToken_Out,
  216. BfToken_Override,
  217. BfToken_Params,
  218. BfToken_Private,
  219. BfToken_Protected,
  220. BfToken_Public,
  221. BfToken_ReadOnly,
  222. BfToken_Repeat,
  223. BfToken_Ref,
  224. BfToken_RetType,
  225. BfToken_Return,
  226. BfToken_Scope,
  227. BfToken_Sealed,
  228. BfToken_SizeOf,
  229. BfToken_Static,
  230. BfToken_StrideOf,
  231. BfToken_Struct,
  232. BfToken_Switch,
  233. BfToken_This,
  234. BfToken_Throw,
  235. BfToken_Try,
  236. BfToken_TypeAlias,
  237. BfToken_TypeOf,
  238. BfToken_Unchecked,
  239. BfToken_Unsigned,
  240. BfToken_Using,
  241. BfToken_Var,
  242. BfToken_Virtual,
  243. BfToken_Volatile,
  244. BfToken_When,
  245. BfToken_Where,
  246. BfToken_While,
  247. BfToken_Yield,
  248. BfToken_AssignEquals,
  249. BfToken_CompareEquals,
  250. BfToken_CompareStrictEquals,
  251. BfToken_CompareNotEquals,
  252. BfToken_CompareStrictNotEquals,
  253. BfToken_LessEquals,
  254. BfToken_GreaterEquals,
  255. BfToken_Spaceship,
  256. BfToken_PlusEquals,
  257. BfToken_MinusEquals,
  258. BfToken_MultiplyEquals,
  259. BfToken_DivideEquals,
  260. BfToken_ModulusEquals,
  261. BfToken_ShiftLeftEquals,
  262. BfToken_ShiftRightEquals,
  263. BfToken_AndEquals,
  264. BfToken_AndMinus,
  265. BfToken_AndPlus,
  266. BfToken_AndStar,
  267. BfToken_AndMinusEquals,
  268. BfToken_AndPlusEquals,
  269. BfToken_AndStarEquals,
  270. BfToken_OrEquals,
  271. BfToken_XorEquals,
  272. BfToken_NullCoalsceEquals,
  273. BfToken_LBrace,
  274. BfToken_RBrace,
  275. BfToken_LParen,
  276. BfToken_RParen,
  277. BfToken_LBracket,
  278. BfToken_RBracket,
  279. BfToken_LChevron,
  280. BfToken_RChevron,
  281. BfToken_LDblChevron,
  282. BfToken_RDblChevron,
  283. BfToken_Semicolon,
  284. BfToken_Colon,
  285. BfToken_ColonColon,
  286. BfToken_Comma,
  287. BfToken_Dot,
  288. BfToken_DotDot,
  289. BfToken_DotDotDot,
  290. BfToken_DotDotLess,
  291. BfToken_QuestionDot,
  292. BfToken_QuestionLBracket,
  293. BfToken_AutocompleteDot,
  294. BfToken_Plus,
  295. BfToken_Minus,
  296. BfToken_DblPlus,
  297. BfToken_DblMinus,
  298. BfToken_Star,
  299. BfToken_ForwardSlash,
  300. BfToken_Modulus,
  301. BfToken_Ampersand,
  302. BfToken_At,
  303. BfToken_DblAmpersand,
  304. BfToken_Bar,
  305. BfToken_DblBar,
  306. BfToken_Bang,
  307. BfToken_Carat,
  308. BfToken_Tilde,
  309. BfToken_Question,
  310. BfToken_DblQuestion,
  311. BfToken_Arrow,
  312. BfToken_FatArrow,
  313. };
  314. class BfAstNode;
  315. class BfScopeNode;
  316. class BfNewNode;
  317. class BfLabeledBlock;
  318. class BfGenericArgumentsNode;
  319. class BfCtorExplicitNode;
  320. class BfStatement;
  321. class BfLabelableStatement;
  322. class BfExpression;
  323. class BfExpressionStatement;
  324. class BfNamedExpression;
  325. class BfAttributedExpression;
  326. class BfAttributedStatement;
  327. class BfLiteralExpression;
  328. class BfStringInterpolationExpression;
  329. class BfBlock;
  330. class BfUnscopedBlock;
  331. class BfBlockExtension;
  332. class BfRootNode;
  333. class BfErrorNode;
  334. class BfTokenNode;
  335. class BfIdentifierNode;
  336. class BfAttributedIdentifierNode;
  337. class BfQualifiedNameNode;
  338. class BfNamespaceDeclaration;
  339. class BfTypeDeclaration;
  340. class BfInitializerTypeDeclaration;
  341. class BfTypeAliasDeclaration;
  342. class BfMethodDeclaration;
  343. class BfOperatorDeclaration;
  344. class BfFieldDeclaration;
  345. class BfEnumCaseDeclaration;
  346. class BfParameterDeclaration;
  347. class BfForStatement;
  348. class BfUsingStatement;
  349. class BfDoStatement;
  350. class BfRepeatStatement;
  351. class BfWhileStatement;
  352. class BfMemberDeclaration;
  353. class BfTypeReference;
  354. class BfParameterDeclaration;
  355. class BfVariableDeclaration;
  356. class BfLocalMethodDeclaration;
  357. class BfScopedInvocationTarget;
  358. class BfInvocationExpression;
  359. class BfDeferStatement;
  360. class BfReturnStatement;
  361. class BfYieldStatement;
  362. class BfUnaryOperatorExpression;
  363. class BfBinaryOperatorExpression;
  364. class BfInlineTypeReference;
  365. class BfArrayTypeRef;
  366. class BfPointerTypeRef;
  367. class BfDotTypeReference;
  368. class BfVarTypeReference;
  369. class BfVarRefTypeReference;
  370. class BfLetTypeReference;
  371. class BfGenericInstanceTypeRef;
  372. class BfTupleTypeRef;
  373. class BfTagTypeRef;
  374. class BfDelegateTypeRef;
  375. class BfExprModTypeRef;
  376. class BfCommentNode;
  377. class BfIfStatement;
  378. class BfParenthesizedExpression;
  379. class BfTupleExpression;
  380. class BfAssignmentExpression;
  381. class BfNamedTypeReference;
  382. class BfObjectCreateExpression;
  383. class BfBoxExpression;
  384. class BfDelegateBindExpression;
  385. class BfLambdaBindExpression;
  386. class BfCastExpression;
  387. class BfGenericParamsDeclaration;
  388. class BfThisExpression;
  389. class BfBaseExpression;
  390. class BfMixinExpression;
  391. class BfTryStatement;
  392. class BfCatchStatement;
  393. class BfFinallyStatement;
  394. class BfCheckedStatement;
  395. class BfUncheckedStatement;
  396. class BfBreakStatement;
  397. class BfContinueStatement;
  398. class BfFallthroughStatement;
  399. class BfThrowStatement;
  400. class BfDeleteStatement;
  401. class BfIndexerExpression;
  402. class BfMemberReferenceExpression;
  403. class BfDynamicCastExpression;
  404. class BfCheckTypeExpression;
  405. class BfConstructorDeclaration;
  406. class BfAutoConstructorDeclaration;
  407. class BfDestructorDeclaration;
  408. class BfQualifiedTypeReference;
  409. class BfUsingDirective;
  410. class BfUsingModDirective;
  411. class BfPropertyMethodDeclaration;
  412. class BfPropertyBodyExpression;
  413. class BfPropertyDeclaration;
  414. class BfIndexerDeclaration;
  415. class BfPreprocesorIgnoredSectionNode;
  416. class BfPreprocessorNode;
  417. class BfPreprocessorDefinedExpression;
  418. class BfTypeOfExpression;
  419. class BfEnumCaseBindExpression;
  420. class BfSwitchCase;
  421. class BfCaseExpression;
  422. class BfWhenExpression;
  423. class BfSwitchStatement;
  424. class BfForEachStatement;
  425. class BfTypedValueExpression;
  426. class BfTypeAttrExpression;
  427. class BfSizeOfExpression;
  428. class BfAlignOfExpression;
  429. class BfOffsetOfExpression;
  430. class BfNameOfExpression;
  431. class BfStrideOfExpression;
  432. class BfIsConstExpression;
  433. class BfDefaultExpression;
  434. class BfUninitializedExpression;
  435. class BfConditionalExpression;
  436. class BfInitializerExpression;
  437. class BfCollectionInitializerExpression;
  438. class BfSizedArrayCreateExpression;
  439. class BfEmptyStatement;
  440. class BfGenericOperatorConstraint;
  441. class BfGenericConstraintsDeclaration;
  442. class BfAttributeDirective;
  443. class BfNullableTypeRef;
  444. class BfRefTypeRef;
  445. class BfModifiedTypeRef;
  446. class BfConstTypeRef;
  447. class BfConstExprTypeRef;
  448. class BfInlineAsmStatement;
  449. class BfInlineAsmInstruction;
  450. class BfFieldDtorDeclaration;
  451. class BfStructuralVisitor
  452. {
  453. public:
  454. bool mCapturingChildRef;
  455. BfAstNode** mCurChildRef;
  456. public:
  457. void VisitMembers(BfBlock* node);
  458. void VisitChildNoRef(BfAstNode* nodeRef);
  459. void DoVisitChild(BfAstNode*& nodeRef);
  460. void AssertValidChildAddr(BfAstNode** nodeRef);
  461. template <typename T>
  462. void VisitChild(T& nodeRef)
  463. {
  464. /*if ((BfAstNode*)nodeRef == NULL)
  465. return;
  466. nodeRef->Accept(this);*/
  467. if (nodeRef == NULL)
  468. return;
  469. if (mCapturingChildRef)
  470. {
  471. mCurChildRef = ((BfAstNode**) &nodeRef);
  472. //AssertValidChildAddr(mCurChildRef);
  473. }
  474. nodeRef->Accept(this);
  475. mCurChildRef = NULL;
  476. }
  477. template <typename T>
  478. void VisitChildNoRef(const T& nodeRef)
  479. {
  480. if ((BfAstNode*)nodeRef == NULL)
  481. return;
  482. nodeRef->Accept(this);
  483. };
  484. public:
  485. BfStructuralVisitor();
  486. virtual void Visit(BfAstNode* bfAstNode) {}
  487. virtual void Visit(BfErrorNode* bfErrorNode);
  488. virtual void Visit(BfScopeNode* scopeNode);
  489. virtual void Visit(BfNewNode* newNode);
  490. virtual void Visit(BfLabeledBlock* labeledBlock);
  491. virtual void Visit(BfExpression* expr);
  492. virtual void Visit(BfExpressionStatement* exprStmt);
  493. virtual void Visit(BfNamedExpression* namedExpr);
  494. virtual void Visit(BfAttributedExpression* attribExpr);
  495. virtual void Visit(BfStatement* stmt);
  496. virtual void Visit(BfAttributedStatement* attribStmt);
  497. virtual void Visit(BfLabelableStatement* labelableStmt);
  498. virtual void Visit(BfTypedValueExpression* typedValueExpr);
  499. virtual void Visit(BfCommentNode* commentNode);
  500. virtual void Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection);
  501. virtual void Visit(BfPreprocessorNode* preprocessorNode);
  502. virtual void Visit(BfPreprocessorDefinedExpression* definedExpr);
  503. virtual void Visit(BfAttributeDirective* attributeDirective);
  504. virtual void Visit(BfGenericParamsDeclaration* genericParams);
  505. virtual void Visit(BfGenericOperatorConstraint* genericConstraints);
  506. virtual void Visit(BfGenericConstraintsDeclaration* genericConstraints);
  507. virtual void Visit(BfGenericArgumentsNode* genericArgumentsNode);
  508. virtual void Visit(BfCtorExplicitNode* genericArgumentsNode);
  509. virtual void Visit(BfEmptyStatement* emptyStmt);
  510. virtual void Visit(BfTokenNode* tokenNode);
  511. virtual void Visit(BfTokenPairNode* tokenPairNode);
  512. virtual void Visit(BfUsingSpecifierNode* usingSpecifier);
  513. virtual void Visit(BfLiteralExpression* literalExpr);
  514. virtual void Visit(BfStringInterpolationExpression* stringInterpolationExpression);
  515. virtual void Visit(BfIdentifierNode* identifierNode);
  516. virtual void Visit(BfAttributedIdentifierNode* attrIdentifierNode);
  517. virtual void Visit(BfQualifiedNameNode* nameNode);
  518. virtual void Visit(BfThisExpression* thisExpr);
  519. virtual void Visit(BfBaseExpression* baseExpr);
  520. virtual void Visit(BfMixinExpression* thisExpr);
  521. virtual void Visit(BfSizedArrayCreateExpression* createExpr);
  522. virtual void Visit(BfInitializerExpression* collectionInitExpr);
  523. virtual void Visit(BfCollectionInitializerExpression* collectionInitExpr);
  524. virtual void Visit(BfTypeReference* typeRef);
  525. virtual void Visit(BfInlineTypeReference* typeRef);
  526. virtual void Visit(BfNamedTypeReference* typeRef);
  527. virtual void Visit(BfQualifiedTypeReference* qualifiedType);
  528. virtual void Visit(BfDotTypeReference* typeRef);
  529. virtual void Visit(BfVarTypeReference* typeRef);
  530. virtual void Visit(BfVarRefTypeReference* typeRef);
  531. virtual void Visit(BfLetTypeReference* typeRef);
  532. virtual void Visit(BfConstTypeRef* typeRef);
  533. virtual void Visit(BfConstExprTypeRef* typeRef);
  534. virtual void Visit(BfRefTypeRef* typeRef);
  535. virtual void Visit(BfModifiedTypeRef* typeRef);
  536. virtual void Visit(BfArrayTypeRef* typeRef);
  537. virtual void Visit(BfGenericInstanceTypeRef* typeRef);
  538. virtual void Visit(BfTupleTypeRef* typeRef);
  539. virtual void Visit(BfTagTypeRef* typeRef);
  540. virtual void Visit(BfDelegateTypeRef* typeRef);
  541. virtual void Visit(BfExprModTypeRef* declTypeRef);
  542. virtual void Visit(BfPointerTypeRef* typeRef);
  543. virtual void Visit(BfNullableTypeRef* typeRef);
  544. virtual void Visit(BfVariableDeclaration* varDecl);
  545. virtual void Visit(BfLocalMethodDeclaration* methodDecl);
  546. virtual void Visit(BfParameterDeclaration* paramDecl);
  547. virtual void Visit(BfTypeAttrExpression* typeAttrExpr);
  548. virtual void Visit(BfTypeOfExpression* typeOfExpr);
  549. virtual void Visit(BfSizeOfExpression* sizeOfExpr);
  550. virtual void Visit(BfAlignOfExpression* alignOfExpr);
  551. virtual void Visit(BfStrideOfExpression* strideOfExpr);
  552. virtual void Visit(BfOffsetOfExpression* offsetOfExpr);
  553. virtual void Visit(BfNameOfExpression* nameOfExpr);
  554. virtual void Visit(BfIsConstExpression* isConstExpr);
  555. virtual void Visit(BfDefaultExpression* defaultExpr);
  556. virtual void Visit(BfUninitializedExpression* uninitializedExpr);
  557. virtual void Visit(BfCheckTypeExpression* checkTypeExpr);
  558. virtual void Visit(BfDynamicCastExpression* dynCastExpr);
  559. virtual void Visit(BfCastExpression* castExpr);
  560. virtual void Visit(BfDelegateBindExpression* delegateBindExpr);
  561. virtual void Visit(BfLambdaBindExpression* lambdaBindExpr);
  562. virtual void Visit(BfObjectCreateExpression* objCreateExpr);
  563. virtual void Visit(BfBoxExpression* boxExpr);
  564. virtual void Visit(BfScopedInvocationTarget* scopedTarget);
  565. virtual void Visit(BfInvocationExpression* invocationExpr);
  566. virtual void Visit(BfEnumCaseBindExpression* caseBindExpr);
  567. virtual void Visit(BfCaseExpression* caseExpr);
  568. virtual void Visit(BfSwitchCase* switchCase);
  569. virtual void Visit(BfWhenExpression* whenExpr);
  570. virtual void Visit(BfSwitchStatement* switchStmt);
  571. virtual void Visit(BfTryStatement* tryStmt);
  572. virtual void Visit(BfCatchStatement* catchStmt);
  573. virtual void Visit(BfFinallyStatement* finallyStmt);
  574. virtual void Visit(BfCheckedStatement* checkedStmt);
  575. virtual void Visit(BfUncheckedStatement* uncheckedStmt);
  576. virtual void Visit(BfIfStatement* ifStmt);
  577. virtual void Visit(BfThrowStatement* throwStmt);
  578. virtual void Visit(BfDeleteStatement* deleteStmt);
  579. virtual void Visit(BfReturnStatement* returnStmt);
  580. virtual void Visit(BfYieldStatement* returnStmt);
  581. virtual void Visit(BfBreakStatement* breakStmt);
  582. virtual void Visit(BfContinueStatement* continueStmt);
  583. virtual void Visit(BfFallthroughStatement* fallthroughStmt);
  584. virtual void Visit(BfUsingStatement* whileStmt);
  585. virtual void Visit(BfDoStatement* whileStmt);
  586. virtual void Visit(BfRepeatStatement* repeatStmt);
  587. virtual void Visit(BfWhileStatement* whileStmt);
  588. virtual void Visit(BfForStatement* forStmt);
  589. virtual void Visit(BfForEachStatement* forEachStmt);
  590. virtual void Visit(BfDeferStatement* deferStmt);
  591. virtual void Visit(BfConditionalExpression* condExpr);
  592. virtual void Visit(BfAssignmentExpression* assignExpr);
  593. virtual void Visit(BfParenthesizedExpression* parenExpr);
  594. virtual void Visit(BfTupleExpression* parenExpr);
  595. virtual void Visit(BfMemberReferenceExpression* memberRefExpr);
  596. virtual void Visit(BfIndexerExpression* indexerExpr);
  597. virtual void Visit(BfUnaryOperatorExpression* binOpExpr);
  598. virtual void Visit(BfBinaryOperatorExpression* binOpExpr);
  599. virtual void Visit(BfConstructorDeclaration* ctorDeclaration);
  600. virtual void Visit(BfAutoConstructorDeclaration* ctorDeclaration);
  601. virtual void Visit(BfDestructorDeclaration* dtorDeclaration);
  602. virtual void Visit(BfMethodDeclaration* methodDeclaration);
  603. virtual void Visit(BfOperatorDeclaration* operatorDeclaration);
  604. virtual void Visit(BfPropertyMethodDeclaration* propertyMethodDeclaration);
  605. virtual void Visit(BfPropertyBodyExpression* propertyBodyExpression);
  606. virtual void Visit(BfPropertyDeclaration* propertyDeclaration);
  607. virtual void Visit(BfIndexerDeclaration* indexerDeclaration);
  608. virtual void Visit(BfFieldDeclaration* fieldDeclaration);
  609. virtual void Visit(BfEnumCaseDeclaration* enumCaseDeclaration);
  610. virtual void Visit(BfFieldDtorDeclaration* fieldDtorDeclaration);
  611. virtual void Visit(BfTypeDeclaration* typeDeclaration);
  612. virtual void Visit(BfTypeAliasDeclaration* typeDeclaration);
  613. virtual void Visit(BfUsingDirective* usingDirective);
  614. virtual void Visit(BfUsingModDirective* usingDirective);
  615. virtual void Visit(BfNamespaceDeclaration* namespaceDeclaration);
  616. virtual void Visit(BfBlock* block);
  617. virtual void Visit(BfUnscopedBlock* block);
  618. virtual void Visit(BfBlockExtension* block);
  619. virtual void Visit(BfRootNode* rootNode);
  620. virtual void Visit(BfInlineAsmStatement* asmStmt);
  621. virtual void Visit(BfInlineAsmInstruction* asmInst);
  622. };
  623. enum BfTypedValueKind
  624. {
  625. BfTypedValueKind_Addr,
  626. BfTypedValueKind_VolatileAddr,
  627. BfTypedValueKind_CopyOnMutateAddr,
  628. BfTypedValueKind_CopyOnMutateAddr_Derived,
  629. BfTypedValueKind_ReadOnlyAddr,
  630. BfTypedValueKind_TempAddr,
  631. BfTypedValueKind_RestrictedTempAddr,
  632. BfTypedValueKind_ReadOnlyTempAddr,
  633. BfTypedValueKind_ThisAddr,
  634. BfTypedValueKind_BaseAddr,
  635. BfTypedValueKind_ReadOnlyThisAddr,
  636. BfTypedValueKind_ReadOnlyBaseAddr,
  637. BfTypedValueKind_Value,
  638. BfTypedValueKind_ThisValue,
  639. BfTypedValueKind_BaseValue,
  640. BfTypedValueKind_ReadOnlyThisValue,
  641. BfTypedValueKind_ReadOnlyBaseValue,
  642. BfTypedValueKind_MutableValue, // Only applicable for generic params
  643. BfTypedValueKind_SplatHead,
  644. BfTypedValueKind_ThisSplatHead,
  645. BfTypedValueKind_BaseSplatHead,
  646. BfTypedValueKind_SplatHead_NeedsCasting,
  647. BfTypedValueKind_ParamsSplat,
  648. BfTypedValueKind_Params,
  649. BfTypedValueKind_NoValue,
  650. BfTypedValueKind_UntypedValue,
  651. BfTypedValueKind_GenericConstValue
  652. };
  653. class BfTypedValue
  654. {
  655. public:
  656. //llvm::Value* mValue;
  657. BfIRValue mValue;
  658. BfType* mType;
  659. BfTypedValueKind mKind; // Is address of variable
  660. public:
  661. BfTypedValue()
  662. {
  663. mType = NULL;
  664. mKind = BfTypedValueKind_NoValue;
  665. }
  666. BfTypedValue(BfTypedValueKind kind)
  667. {
  668. mType = NULL;
  669. mKind = kind;
  670. }
  671. BfTypedValue(BfType* resolvedType)
  672. {
  673. mType = resolvedType;
  674. mKind = BfTypedValueKind_NoValue;
  675. }
  676. BfTypedValue(BfIRValue val, BfType* resolvedType, bool isAddr)
  677. {
  678. BF_ASSERT((!val) || (resolvedType != NULL));
  679. mValue = val;
  680. mType = resolvedType;
  681. mKind = isAddr ? BfTypedValueKind_Addr : BfTypedValueKind_Value;
  682. #ifdef _DEBUG
  683. //DbgCheckType();
  684. #endif
  685. BF_ASSERT(val);
  686. /*if ((!val) && (resolvedType != NULL))
  687. {
  688. BF_ASSERT(IsValuelessType());
  689. }
  690. else if (IsValuelessType())
  691. {
  692. //BF_ASSERT(!val || IsAddr());
  693. }*/
  694. }
  695. BfTypedValue(BfIRValue val, BfType* resolvedType, BfTypedValueKind kind = BfTypedValueKind_Value)
  696. {
  697. BF_ASSERT((!val) || (resolvedType != NULL));
  698. mValue = val;
  699. mType = resolvedType;
  700. mKind = kind;
  701. #ifdef _DEBUG
  702. //DbgCheckType();
  703. #endif
  704. if ((!val) && (resolvedType != NULL))
  705. {
  706. BF_ASSERT(IsValuelessType());
  707. }
  708. /*else if (IsValuelessType())
  709. {
  710. BF_ASSERT(!val || IsAddr());
  711. }*/
  712. }
  713. void DbgCheckType() const;
  714. bool IsValuelessType() const;
  715. bool HasType() const
  716. {
  717. return mType != NULL;
  718. }
  719. bool IsStatic() const
  720. {
  721. return (!mValue) && (mKind != BfTypedValueKind_GenericConstValue);
  722. }
  723. bool IsAddr() const
  724. {
  725. return (mKind < BfTypedValueKind_Value);
  726. }
  727. bool IsTempAddr() const
  728. {
  729. return ((mKind == BfTypedValueKind_ReadOnlyTempAddr) || (mKind == BfTypedValueKind_RestrictedTempAddr) || (mKind == BfTypedValueKind_TempAddr));
  730. }
  731. bool IsCopyOnMutate() const
  732. {
  733. return (mKind == BfTypedValueKind_CopyOnMutateAddr) || (mKind == BfTypedValueKind_CopyOnMutateAddr_Derived);
  734. }
  735. bool IsReadOnly() const
  736. {
  737. switch (mKind)
  738. {
  739. case BfTypedValueKind_ReadOnlyAddr:
  740. case BfTypedValueKind_ReadOnlyTempAddr:
  741. case BfTypedValueKind_ReadOnlyThisValue:
  742. case BfTypedValueKind_ReadOnlyBaseValue:
  743. case BfTypedValueKind_ReadOnlyThisAddr:
  744. case BfTypedValueKind_ReadOnlyBaseAddr:
  745. case BfTypedValueKind_MutableValue: // 'mutable' means we can call mut methods, not that we can assign to it
  746. case BfTypedValueKind_SplatHead:
  747. case BfTypedValueKind_ThisSplatHead:
  748. case BfTypedValueKind_BaseSplatHead:
  749. case BfTypedValueKind_ParamsSplat:
  750. case BfTypedValueKind_Params:
  751. return true;
  752. default:
  753. return false;
  754. }
  755. return false;
  756. }
  757. bool IsThis() const
  758. {
  759. return (mKind == BfTypedValueKind_ThisValue) || (mKind == BfTypedValueKind_ThisAddr) || (mKind == BfTypedValueKind_ReadOnlyThisValue) ||
  760. (mKind == BfTypedValueKind_ReadOnlyThisAddr) || (mKind == BfTypedValueKind_ThisSplatHead);
  761. }
  762. bool IsBase() const
  763. {
  764. return (mKind == BfTypedValueKind_BaseValue) || (mKind == BfTypedValueKind_BaseAddr) || (mKind == BfTypedValueKind_ReadOnlyBaseValue) ||
  765. (mKind == BfTypedValueKind_ReadOnlyBaseAddr) || (mKind == BfTypedValueKind_BaseSplatHead);
  766. }
  767. void ToBase()
  768. {
  769. BF_ASSERT(IsThis());
  770. mKind = (BfTypedValueKind)((int)mKind + 1);
  771. }
  772. void ToThis()
  773. {
  774. BF_ASSERT(IsBase());
  775. mKind = (BfTypedValueKind)((int)mKind - 1);
  776. }
  777. bool IsVolatile() const
  778. {
  779. return mKind == BfTypedValueKind_VolatileAddr;
  780. }
  781. bool IsSplat() const
  782. {
  783. return (mKind >= BfTypedValueKind_SplatHead) && (mKind <= BfTypedValueKind_ParamsSplat);
  784. }
  785. bool IsUntypedValue() const
  786. {
  787. return (mKind == BfTypedValueKind_UntypedValue);
  788. }
  789. bool IsNoValueType() const
  790. {
  791. return (mKind == BfTypedValueKind_NoValue) && (mType != NULL);
  792. }
  793. bool IsParams() const
  794. {
  795. return (mKind == BfTypedValueKind_ParamsSplat) || (mKind == BfTypedValueKind_Params);
  796. }
  797. operator bool() const
  798. {
  799. //return (mKind != BfTypedValueKind_NoValue) && ((mValue) || ((mType != NULL) && (IsValuelessType())));
  800. return (mKind != BfTypedValueKind_NoValue);
  801. }
  802. void MakeReadOnly()
  803. {
  804. switch (mKind)
  805. {
  806. case BfTypedValueKind_Addr:
  807. mKind = BfTypedValueKind_ReadOnlyAddr;
  808. break;
  809. case BfTypedValueKind_TempAddr:
  810. case BfTypedValueKind_RestrictedTempAddr:
  811. mKind = BfTypedValueKind_ReadOnlyTempAddr;
  812. break;
  813. default:
  814. break;
  815. }
  816. }
  817. void MakeTemporary(bool restricted = false)
  818. {
  819. switch (mKind)
  820. {
  821. case BfTypedValueKind_Addr:
  822. mKind = restricted ? BfTypedValueKind_RestrictedTempAddr : BfTypedValueKind_TempAddr;
  823. break;
  824. case BfTypedValueKind_ReadOnlyAddr:
  825. mKind = BfTypedValueKind_ReadOnlyTempAddr;
  826. break;
  827. default:
  828. break;
  829. }
  830. }
  831. bool CanModify() const;
  832. };
  833. #define BF_AST_TYPE(name, TBase) \
  834. static BfAstTypeInfo sTypeInfo;\
  835. static void ClassAccept(BfAstNode* node, BfStructuralVisitor* bfVisitor) { bfVisitor->Visit((name*)node); } \
  836. TBase* ToBase() { return (TBase*)this; } \
  837. name() { InitWithTypeId(sTypeInfo.mTypeId); }
  838. #ifdef BF_AST_DO_IMPL
  839. #define BF_AST_DECL(name, TBase) \
  840. BfAstTypeInfo name::sTypeInfo(#name, &TBase::sTypeInfo, &name::ClassAccept);
  841. #else
  842. #define BF_AST_DECL(name, TBase)
  843. #endif
  844. class BfAstNode;
  845. class BfAstNodeList
  846. {
  847. public:
  848. SizedArray<BfAstNode*, 4> mList;
  849. public:
  850. bool operator==(const BfAstNodeList& rhs)
  851. {
  852. if (mList.mSize != rhs.mList.mSize)
  853. return false;
  854. for (int i = 0; i < mList.mSize; i++)
  855. if (mList[i] != rhs.mList[i])
  856. return false;
  857. return true;
  858. }
  859. };
  860. template <typename T>
  861. class BfChunkedArray
  862. {
  863. public:
  864. static const int sLeafSize = 8;
  865. T** mRoots;
  866. int mSize;
  867. public:
  868. BfChunkedArray()
  869. {
  870. mSize = 0;
  871. }
  872. int GetRootCount()
  873. {
  874. return (mSize + sLeafSize - 1) / sLeafSize;
  875. }
  876. void Add(T val, BfAstAllocator* bumpAlloc)
  877. {
  878. int idx = mSize;
  879. if ((mSize % sLeafSize) == 0)
  880. {
  881. int rootCount = GetRootCount();
  882. mSize++;
  883. int newRootCount = GetRootCount();
  884. if (rootCount != newRootCount)
  885. {
  886. T** newRoots = (T**)bumpAlloc->AllocBytes(newRootCount * sizeof(T**), sizeof(T**));
  887. memcpy(newRoots, mRoots, rootCount * sizeof(T*));
  888. mRoots = newRoots;
  889. }
  890. mRoots[idx / sLeafSize] = (T*)bumpAlloc->AllocBytes(sLeafSize * sizeof(T*), sizeof(T*));
  891. }
  892. else
  893. mSize++;
  894. mRoots[idx / sLeafSize][idx % sLeafSize] = val;
  895. }
  896. bool IsEmpty()
  897. {
  898. return mSize == 0;
  899. }
  900. void SetSize(int size)
  901. {
  902. BF_ASSERT(size <= mSize);
  903. mSize = size;
  904. }
  905. T& operator[](int idx)
  906. {
  907. return mRoots[idx / sLeafSize][idx % sLeafSize];
  908. }
  909. T Get(int idx)
  910. {
  911. if ((idx < 0) || (idx >= mSize))
  912. return (T)0;
  913. return mRoots[idx / sLeafSize][idx % sLeafSize];
  914. }
  915. T GetLast()
  916. {
  917. if (mSize == 0)
  918. return (T)0;
  919. return (*this)[mSize - 1];
  920. }
  921. T GetFirst()
  922. {
  923. if (mSize == 0)
  924. return (T)0;
  925. return (*this)[0];
  926. }
  927. };
  928. template <typename T>
  929. class BfDebugArray
  930. {
  931. public:
  932. static const int STATIC_SIZE = 1024;
  933. Array<T> mElements;
  934. int mSize;
  935. public:
  936. BfDebugArray()
  937. {
  938. mSize = 0;
  939. }
  940. void Add(T val, BfAstAllocator* bumpAlloc)
  941. {
  942. mElements.push_back(val);
  943. mSize++;
  944. }
  945. bool IsEmpty()
  946. {
  947. return mSize == 0;
  948. }
  949. void SetSize(int size)
  950. {
  951. BF_ASSERT(size <= mSize);
  952. mSize = size;
  953. }
  954. T& operator[](int idx)
  955. {
  956. return mElements[idx];
  957. }
  958. T Get(int idx)
  959. {
  960. if ((idx < 0) || (idx >= mSize))
  961. return (T)0;
  962. return mElements[idx];
  963. }
  964. T GetLast()
  965. {
  966. if (mSize == 0)
  967. return (T)0;
  968. return mElements[mSize - 1];
  969. }
  970. T GetFirst()
  971. {
  972. if (mSize == 0)
  973. return (T)0;
  974. return (*this)[0];
  975. }
  976. };
  977. template <typename T>
  978. class BfDeferredSizedArray : public llvm::SmallVector<T, 8>
  979. {
  980. public:
  981. BfSizedArray<T>* mSizedArray;
  982. BfAstAllocator* mAlloc;
  983. public:
  984. BfDeferredSizedArray(BfSizedArray<T>& arr, BfAstAllocator* alloc)
  985. {
  986. mSizedArray = &arr;
  987. mAlloc = alloc;
  988. }
  989. ~BfDeferredSizedArray()
  990. {
  991. mSizedArray->mSize = (int)this->size();
  992. if (mSizedArray->mSize > 0)
  993. {
  994. mSizedArray->mVals = (T*)mAlloc->AllocBytes(mSizedArray->mSize * sizeof(T), sizeof(T));
  995. memcpy(mSizedArray->mVals, &(*this)[0], mSizedArray->mSize * sizeof(T));
  996. }
  997. }
  998. };
  999. #ifdef BF_USE_NEAR_NODE_REF
  1000. #define ASTREF(T) BfNearNodeRef<T>
  1001. #else
  1002. #define ASTREF(T) T
  1003. #endif
  1004. template <typename T, typename T2>
  1005. static void BfSizedArrayInitIndirect(BfSizedArray<T>& sizedArray, const SizedArrayImpl<T2>& vec, BfAstAllocator* alloc)
  1006. {
  1007. sizedArray.mSize = (int)vec.size();
  1008. BF_ASSERT(sizedArray.mSize >= 0);
  1009. if (sizedArray.mSize > 0)
  1010. {
  1011. sizedArray.mVals = (T*)alloc->AllocBytes(sizedArray.mSize * sizeof(T), sizeof(T));
  1012. for (int i = 0; i < sizedArray.mSize; i++)
  1013. sizedArray.mVals[i] = vec[i];
  1014. }
  1015. }
  1016. template <typename T>
  1017. class BfDeferredAstSizedArray : public SizedArray<T, 8>
  1018. {
  1019. public:
  1020. BfSizedArray<ASTREF(T)>* mSizedArray;
  1021. BfAstAllocator* mAlloc;
  1022. public:
  1023. BfDeferredAstSizedArray(BfSizedArray<ASTREF(T)>& arr, BfAstAllocator* alloc)
  1024. {
  1025. mSizedArray = &arr;
  1026. mAlloc = alloc;
  1027. }
  1028. ~BfDeferredAstSizedArray()
  1029. {
  1030. BfSizedArrayInitIndirect(*mSizedArray, *this, mAlloc);
  1031. }
  1032. };
  1033. typedef void(*BfAstAcceptFunc)(BfAstNode* node, BfStructuralVisitor* visitor);
  1034. class BfAstTypeInfo
  1035. {
  1036. public:
  1037. const char* mName;
  1038. BfAstTypeInfo* mBaseType;
  1039. Array<BfAstTypeInfo*> mDerivedTypes;
  1040. uint8 mTypeId;
  1041. uint8 mFullDerivedCount; // Including all ancestors
  1042. BfAstAcceptFunc mAcceptFunc;
  1043. BfAstTypeInfo(const char* name, BfAstTypeInfo* baseType, BfAstAcceptFunc acceptFunc);
  1044. public:
  1045. static void Init();
  1046. };
  1047. #ifdef BF_AST_COMPACT
  1048. struct BfAstInfo
  1049. {
  1050. int mTriviaStart;
  1051. int mSrcStart;
  1052. int mSrcEnd;
  1053. uint8 mTypeId;
  1054. BfToken mToken;
  1055. };
  1056. #endif
  1057. class BfAstNode
  1058. {
  1059. public:
  1060. static BfAstTypeInfo sTypeInfo;
  1061. #ifndef BF_AST_ALLOCATOR_USE_PAGES
  1062. BfSourceData* mSourceData;
  1063. #endif
  1064. #ifdef BF_AST_HAS_PARENT_MEMBER
  1065. BfAstNode* mParent;
  1066. #endif
  1067. #ifdef BF_AST_COMPACT
  1068. union
  1069. {
  1070. struct
  1071. {
  1072. uint8 mCompact_TriviaLen;
  1073. uint8 mCompact_SrcLen;
  1074. uint8 mCompact_TypeId;
  1075. BfToken mCompact_Token;
  1076. int mCompact_SrcStart : 31;
  1077. int mIsCompact : 1;
  1078. };
  1079. BfAstInfo* mAstInfo;
  1080. };
  1081. #else
  1082. int mTriviaStart;
  1083. int mSrcStart;
  1084. int mSrcEnd;
  1085. uint8 mTypeId;
  1086. BfToken mToken;
  1087. #endif
  1088. public:
  1089. BfAstNode()
  1090. {
  1091. #ifdef BF_AST_COMPACT
  1092. // Nothing
  1093. mIsCompact = true;
  1094. #else
  1095. //mParent = NULL;
  1096. mTriviaStart = -1;
  1097. mSrcStart = 0x7FFFFFFF;
  1098. mSrcEnd = 0;
  1099. //mSrcEnd = 0;
  1100. #endif
  1101. }
  1102. #ifdef BF_AST_VTABLE
  1103. virtual ~BfAstNode()
  1104. {
  1105. }
  1106. #endif
  1107. void RemoveSelf();
  1108. void DeleteSelf();
  1109. void RemoveNextSibling();
  1110. void DeleteNextSibling();
  1111. bool IsTemporary();
  1112. int GetStartCharId();
  1113. BfSourceData* GetSourceData();
  1114. BfParserData* GetParserData();
  1115. BfParser* GetParser();
  1116. bool IsEmitted();
  1117. bool IsFromParser(BfParser* parser);
  1118. String ToString();
  1119. StringView ToStringView();
  1120. void ToString(StringImpl& str);
  1121. bool Equals(const StringImpl& str);
  1122. bool Equals(const StringView& str);
  1123. bool Equals(const char* str);
  1124. void Init(BfParser* bfParser);
  1125. void Accept(BfStructuralVisitor* bfVisitor);
  1126. static void ClassAccept(BfAstNode* node, BfStructuralVisitor* bfVisitor) { bfVisitor->Visit(node); }
  1127. bool LocationEquals(BfAstNode* otherNode);
  1128. bool LocationEndEquals(BfAstNode* otherNode);
  1129. String LocationToString();
  1130. void Add(BfAstNode* bfAstNode);
  1131. bool IsMissingSemicolon();
  1132. bool IsExpression();
  1133. bool WantsWarning(int warningNumber);
  1134. template <typename T>
  1135. bool IsA()
  1136. {
  1137. return (uint)GetTypeId() - (uint)T::sTypeInfo.mTypeId <= (uint)T::sTypeInfo.mFullDerivedCount;
  1138. }
  1139. template <typename T>
  1140. bool IsExact()
  1141. {
  1142. return (uint)GetTypeId() == (uint)T::sTypeInfo.mTypeId;
  1143. }
  1144. #ifdef BF_AST_COMPACT
  1145. BfAstInfo* AllocAstInfo();
  1146. void InitEmpty()
  1147. {
  1148. mIsCompact = true;
  1149. mCompact_SrcStart = 0;
  1150. mCompact_SrcLen = 0;
  1151. mCompact_TriviaLen = 0;
  1152. }
  1153. void InitWithTypeId(int typeId)
  1154. {
  1155. mCompact_TypeId = typeId;
  1156. }
  1157. bool IsInitialized()
  1158. {
  1159. return (!mIsCompact) || (mCompact_SrcLen != 0);
  1160. }
  1161. BfToken GetToken()
  1162. {
  1163. if (mIsCompact)
  1164. return mCompact_Token;
  1165. return mAstInfo->mToken;
  1166. }
  1167. void SetToken(BfToken token)
  1168. {
  1169. if (mIsCompact)
  1170. mCompact_Token = token;
  1171. else
  1172. mAstInfo->mToken = token;
  1173. }
  1174. void Init(int triviaStart, int srcStart, int srcEnd)
  1175. {
  1176. int triviaLen = srcStart - triviaStart;
  1177. int srcLen = srcEnd - srcStart;
  1178. if ((triviaLen <= 255) && (srcLen <= 255))
  1179. {
  1180. mCompact_SrcStart = srcStart;
  1181. mIsCompact = 1;
  1182. mCompact_TriviaLen = (uint8)triviaLen;
  1183. mCompact_SrcLen = (uint8)srcLen;
  1184. }
  1185. else
  1186. {
  1187. auto astInfo = AllocAstInfo();
  1188. astInfo->mTypeId = mCompact_TypeId;
  1189. astInfo->mToken = mCompact_Token;
  1190. astInfo->mTriviaStart = triviaStart;
  1191. astInfo->mSrcStart = srcStart;
  1192. astInfo->mSrcEnd = srcEnd;
  1193. mAstInfo = astInfo;
  1194. }
  1195. }
  1196. int GetTypeId()
  1197. {
  1198. if (mIsCompact)
  1199. return mCompact_TypeId;
  1200. return mAstInfo->mTypeId;
  1201. }
  1202. void GetSrcPositions(int& triviaStart, int& srcStart, int& srcEnd)
  1203. {
  1204. if (mIsCompact)
  1205. {
  1206. srcStart = mCompact_SrcStart;
  1207. srcEnd = srcStart + mCompact_SrcLen;
  1208. triviaStart = srcStart - mCompact_TriviaLen;
  1209. }
  1210. else
  1211. {
  1212. triviaStart = mAstInfo->mTriviaStart;
  1213. srcStart = mAstInfo->mSrcStart;
  1214. srcEnd = mAstInfo->mSrcEnd;
  1215. }
  1216. }
  1217. int GetTriviaStart()
  1218. {
  1219. if (mIsCompact)
  1220. return mCompact_SrcStart - mCompact_TriviaLen;
  1221. return mAstInfo->mTriviaStart;
  1222. }
  1223. void SetTriviaStart(int triviaStart)
  1224. {
  1225. if (mIsCompact)
  1226. {
  1227. int triviaLen = mCompact_SrcStart - triviaStart;
  1228. if (triviaLen <= 255)
  1229. {
  1230. mCompact_TriviaLen = (uint8)triviaLen;
  1231. return;
  1232. }
  1233. auto astInfo = AllocAstInfo();
  1234. astInfo->mTypeId = mCompact_TypeId;
  1235. astInfo->mToken = mCompact_Token;
  1236. astInfo->mSrcStart = mCompact_SrcStart;
  1237. astInfo->mSrcEnd = mCompact_SrcStart + mCompact_SrcLen;
  1238. mAstInfo = astInfo;
  1239. }
  1240. mAstInfo->mTriviaStart = triviaStart;
  1241. }
  1242. int GetSrcStart()
  1243. {
  1244. if (mIsCompact)
  1245. return mCompact_SrcStart;
  1246. return mAstInfo->mSrcStart;
  1247. }
  1248. void SetSrcStart(int srcStart)
  1249. {
  1250. if (mIsCompact)
  1251. {
  1252. int startAdjust = srcStart - mCompact_SrcStart;
  1253. uint32 triviaLen = (uint32)((int)mCompact_TriviaLen + startAdjust);
  1254. uint32 srcLen = (uint32)((int)mCompact_SrcLen - startAdjust);
  1255. if ((triviaLen <= 255) && (srcLen <= 255))
  1256. {
  1257. mCompact_SrcStart = srcStart;
  1258. mCompact_TriviaLen = (uint8)triviaLen;
  1259. mCompact_SrcLen = (uint8)srcLen;
  1260. }
  1261. else
  1262. {
  1263. auto astInfo = AllocAstInfo();
  1264. astInfo->mTypeId = mCompact_TypeId;
  1265. astInfo->mSrcStart = srcStart;
  1266. astInfo->mTriviaStart = srcStart - triviaLen;
  1267. astInfo->mSrcEnd = srcStart + srcLen;
  1268. mAstInfo = astInfo;
  1269. }
  1270. }
  1271. else
  1272. mAstInfo->mSrcStart = srcStart;
  1273. }
  1274. int GetSrcEnd()
  1275. {
  1276. if (mIsCompact)
  1277. return mCompact_SrcStart + mCompact_SrcLen;
  1278. return mAstInfo->mSrcEnd;
  1279. }
  1280. void SetSrcEnd(int srcEnd)
  1281. {
  1282. if (mIsCompact)
  1283. {
  1284. int srcLen = srcEnd - mCompact_SrcStart;
  1285. if (srcLen <= 255)
  1286. {
  1287. mCompact_SrcLen = (uint8)srcLen;
  1288. return;
  1289. }
  1290. auto astInfo = AllocAstInfo();
  1291. astInfo->mTypeId = mCompact_TypeId;
  1292. astInfo->mSrcStart = mCompact_SrcStart;
  1293. astInfo->mTriviaStart = mCompact_SrcStart - mCompact_TriviaLen;
  1294. mAstInfo = astInfo;
  1295. }
  1296. mAstInfo->mSrcEnd = srcEnd;
  1297. }
  1298. void AdjustSrcEnd(BfAstNode* srcNode)
  1299. {
  1300. int srcEnd = srcNode->GetSrcEnd();
  1301. if (srcEnd > GetSrcEnd())
  1302. SetSrcEnd(srcEnd);
  1303. }
  1304. int GetSrcLength()
  1305. {
  1306. if (mIsCompact)
  1307. return mCompact_SrcLen;
  1308. return mAstInfo->mSrcEnd - mAstInfo->mSrcStart;
  1309. }
  1310. bool Contains(int srcPos)
  1311. {
  1312. if (mIsCompact)
  1313. return (srcPos >= mCompact_SrcStart) && (srcPos < mCompact_SrcStart + mCompact_SrcLen);
  1314. return (srcPos >= mAstInfo->mSrcStart) && (srcPos < mAstInfo->mSrcEnd);
  1315. }
  1316. #else
  1317. void InitEmpty()
  1318. {
  1319. mTriviaStart = 0;
  1320. mSrcStart = 0;
  1321. mSrcEnd = 0;
  1322. }
  1323. void InitWithTypeId(int typeId)
  1324. {
  1325. mTypeId = typeId;
  1326. }
  1327. bool IsInitialized()
  1328. {
  1329. return mSrcStart != 0x7FFFFFFF;
  1330. }
  1331. void Init(int triviaStart, int srcStart, int srcEnd)
  1332. {
  1333. mTriviaStart = triviaStart;
  1334. mSrcStart = srcStart;
  1335. mSrcEnd = srcEnd;
  1336. }
  1337. BfToken GetToken()
  1338. {
  1339. return mToken;
  1340. }
  1341. void SetToken(BfToken token)
  1342. {
  1343. mToken = token;
  1344. }
  1345. int GetTypeId()
  1346. {
  1347. return mTypeId;
  1348. }
  1349. void GetSrcPositions(int& triviaStart, int& srcStart, int& srcEnd)
  1350. {
  1351. triviaStart = mTriviaStart;
  1352. srcStart = mSrcStart;
  1353. srcEnd = mSrcEnd;
  1354. }
  1355. int GetTriviaStart()
  1356. {
  1357. return mTriviaStart;
  1358. }
  1359. void SetTriviaStart(int triviaStart)
  1360. {
  1361. mTriviaStart = triviaStart;
  1362. }
  1363. int GetSrcStart()
  1364. {
  1365. return mSrcStart;
  1366. }
  1367. void SetSrcStart(int srcStart)
  1368. {
  1369. mSrcStart = srcStart;
  1370. }
  1371. int GetSrcEnd()
  1372. {
  1373. return mSrcEnd;
  1374. }
  1375. void SetSrcEnd(int srcEnd)
  1376. {
  1377. mSrcEnd = srcEnd;
  1378. }
  1379. void AdjustSrcEnd(BfAstNode* srcNode)
  1380. {
  1381. int srcEnd = srcNode->GetSrcEnd();
  1382. if (srcEnd > GetSrcEnd())
  1383. SetSrcEnd(srcEnd);
  1384. }
  1385. int GetSrcLength()
  1386. {
  1387. return mSrcEnd - mSrcStart;
  1388. }
  1389. bool Contains(int srcPos)
  1390. {
  1391. return (srcPos >= mSrcStart) && (srcPos < mSrcEnd);
  1392. }
  1393. bool Contains(int srcPos, int lenAdd, int startAdd)
  1394. {
  1395. return (srcPos >= mSrcStart + startAdd) && (srcPos < mSrcEnd + lenAdd);
  1396. }
  1397. bool Contains(BfAstNode* node)
  1398. {
  1399. return (node->mSrcStart >= mSrcStart) && (node->mSrcEnd <= mSrcEnd);
  1400. }
  1401. #endif
  1402. #ifdef BF_AST_HAS_PARENT_MEMBER
  1403. template <typename T>
  1404. T* FindParentOfType()
  1405. {
  1406. BfAstNode* checkParent = mParent;
  1407. while (checkParent != NULL)
  1408. {
  1409. if (checkParent->IsA<T>())
  1410. return (T*)checkParent;
  1411. checkParent = checkParent->mParent;
  1412. }
  1413. return NULL;
  1414. }
  1415. #endif
  1416. #ifdef BF_AST_HAS_PARENT_MEMBER
  1417. template <typename T>
  1418. static T* ZeroedAlloc()
  1419. {
  1420. T* val = new T();
  1421. memset((uint8*)val + offsetof(T, mParent), 0, sizeof(T) - offsetof(T, mParent));
  1422. return val;
  1423. }
  1424. #else
  1425. template <typename T>
  1426. static T* ZeroedAlloc()
  1427. {
  1428. T* val = new T();
  1429. #ifdef BF_AST_COMPACT
  1430. memset((uint8*)val + offsetof(T, mAstInfo), 0, sizeof(T) - offsetof(T, mAstInfo));
  1431. #else
  1432. memset((uint8*)val + offsetof(T, mTriviaStart), 0, sizeof(T) - offsetof(T, mTriviaStart));
  1433. #endif
  1434. val->InitWithTypeId(T::sTypeInfo.mTypeId);
  1435. return val;
  1436. }
  1437. template <typename T>
  1438. static void Zero(T* val)
  1439. {
  1440. #ifdef BF_AST_COMPACT
  1441. memset((uint8*)val + offsetof(T, mAstInfo), 0, sizeof(T) - offsetof(T, mAstInfo));
  1442. #else
  1443. memset((uint8*)val + offsetof(T, mTriviaStart), 0, sizeof(T) - offsetof(T, mTriviaStart));
  1444. #endif
  1445. val->InitWithTypeId(T::sTypeInfo.mTypeId);
  1446. }
  1447. #endif
  1448. };
  1449. #ifdef BF_AST_DO_IMPL
  1450. BfAstTypeInfo BfAstNode::sTypeInfo("BfAstNode", NULL, &BfAstNode::ClassAccept);
  1451. #endif
  1452. template <typename T>
  1453. bool BfNodeIsA(BfAstNode* node)
  1454. {
  1455. if (node == NULL)
  1456. return false;
  1457. bool canCast = (uint)node->GetTypeId() - (uint)T::sTypeInfo.mTypeId <= (uint)T::sTypeInfo.mFullDerivedCount;
  1458. return canCast;
  1459. }
  1460. template <typename T>
  1461. bool BfNodeIsExact(BfAstNode* node)
  1462. {
  1463. if (node == NULL)
  1464. return false;
  1465. bool canCast = (uint)node->GetTypeId() == (uint)T::sTypeInfo.mTypeId;
  1466. return canCast;
  1467. }
  1468. template <typename T>
  1469. T* BfNodeDynCast(BfAstNode* node)
  1470. {
  1471. if (node == NULL)
  1472. return NULL;
  1473. bool canCast = (uint)node->GetTypeId() - (uint)T::sTypeInfo.mTypeId <= (uint)T::sTypeInfo.mFullDerivedCount;
  1474. //BF_ASSERT(canCast == (node->DynCast(T::TypeId) != NULL));
  1475. return canCast ? (T*)node : NULL;
  1476. }
  1477. template <typename T>
  1478. T* BfNodeDynCastExact(BfAstNode* node)
  1479. {
  1480. if (node == NULL)
  1481. return NULL;
  1482. bool canCast = node->GetTypeId() == T::sTypeInfo.mTypeId;
  1483. //BF_ASSERT(canCast == (node->GetTypeId() == T::TypeId));
  1484. return canCast ? (T*)node : NULL;
  1485. }
  1486. struct BfExteriorNode
  1487. {
  1488. BfSizedArray<BfNamespaceDeclaration*> mNamespaceNodes;
  1489. BfAstNode* mNode;
  1490. };
  1491. BfIdentifierNode* BfIdentifierCast(BfAstNode* node);
  1492. BfAstNode* BfNodeToNonTemporary(BfAstNode* node);
  1493. template <typename T>
  1494. class BfDeferredAstNodeSizedArray : public SizedArray<T, 8>
  1495. {
  1496. public:
  1497. BfAstNode* mParentNode;
  1498. BfSizedArray<ASTREF(T)>* mSizedArray;
  1499. BfAstAllocator* mAlloc;
  1500. public:
  1501. BfDeferredAstNodeSizedArray(BfAstNode* parentNode, BfSizedArray<ASTREF(T)>& arr, BfAstAllocator* alloc)
  1502. {
  1503. mParentNode = parentNode;
  1504. mSizedArray = &arr;
  1505. mAlloc = alloc;
  1506. }
  1507. ~BfDeferredAstNodeSizedArray()
  1508. {
  1509. BfSizedArrayInitIndirect(*mSizedArray, *this, mAlloc);
  1510. if (!this->mSizedArray->IsEmpty())
  1511. {
  1512. int endPos = this->mSizedArray->back()->mSrcEnd;
  1513. if (endPos > this->mParentNode->mSrcEnd)
  1514. this->mParentNode->mSrcEnd = endPos;
  1515. }
  1516. }
  1517. };
  1518. class BfStatement : public BfAstNode
  1519. {
  1520. public:
  1521. BF_AST_TYPE(BfStatement, BfAstNode);
  1522. BfTokenNode* mTrailingSemicolon;
  1523. // bool IsMissingSemicolon();
  1524. // {
  1525. // return mTrailingSemicolon == false;
  1526. // }
  1527. }; BF_AST_DECL(BfStatement, BfAstNode);
  1528. class BfExpression : public BfAstNode
  1529. {
  1530. public:
  1531. BF_AST_TYPE(BfExpression, BfAstNode);
  1532. // bool IsUsedAsStatement()
  1533. // {
  1534. // return mTrailingSemicolon != NULL;
  1535. // }
  1536. bool VerifyIsStatement(BfPassInstance* passInstance, bool ignoreError = false);
  1537. }; BF_AST_DECL(BfExpression, BfAstNode);
  1538. class BfErrorNode : public BfExpression
  1539. {
  1540. public:
  1541. BF_AST_TYPE(BfErrorNode, BfExpression);
  1542. BfAstNode* mRefNode;
  1543. }; BF_AST_DECL(BfErrorNode, BfExpression);
  1544. class BfExpressionStatement : public BfStatement
  1545. {
  1546. public:
  1547. BF_AST_TYPE(BfExpressionStatement, BfStatement);
  1548. BfExpression* mExpression;
  1549. }; BF_AST_DECL(BfExpressionStatement, BfStatement);
  1550. class BfBlockExtension : public BfAstNode
  1551. {
  1552. public:
  1553. BF_AST_TYPE(BfBlockExtension, BfAstNode);
  1554. BfSizedArray<ASTREF(BfAstNode*)> mChildArr;
  1555. }; BF_AST_DECL(BfBlockExtension, BfAstNode);
  1556. class BfBlock : public BfExpression
  1557. {
  1558. public:
  1559. struct Iterator
  1560. {
  1561. public:
  1562. ASTREF(BfAstNode*)* mPtr;
  1563. int mValsLeft;
  1564. public:
  1565. Iterator()
  1566. {
  1567. mPtr = NULL;
  1568. mValsLeft = 0;
  1569. }
  1570. Iterator(ASTREF(BfAstNode*)* ptr, int valsLeft)
  1571. {
  1572. mPtr = ptr;
  1573. mValsLeft = valsLeft;
  1574. if (mValsLeft == 0)
  1575. mPtr = NULL;
  1576. }
  1577. Iterator& operator++()
  1578. {
  1579. BF_ASSERT(mValsLeft >= 0);
  1580. mValsLeft--;
  1581. mPtr++;
  1582. if (mValsLeft == 0)
  1583. {
  1584. mPtr = NULL;
  1585. }
  1586. else
  1587. {
  1588. BfAstNode* curNode = *mPtr;
  1589. if (auto blockExpr = BfNodeDynCastExact<BfBlockExtension>(*mPtr))
  1590. {
  1591. BF_ASSERT(mValsLeft == 1);
  1592. mPtr = blockExpr->mChildArr.mVals;
  1593. mValsLeft = blockExpr->mChildArr.mSize;
  1594. }
  1595. }
  1596. return *this;
  1597. }
  1598. bool operator!=(const Iterator& itr) const
  1599. {
  1600. return itr.mPtr != mPtr;
  1601. }
  1602. bool operator==(const Iterator& itr) const
  1603. {
  1604. return itr.mPtr == mPtr;
  1605. }
  1606. ASTREF(BfAstNode*)& operator*()
  1607. {
  1608. return *mPtr;
  1609. }
  1610. BfAstNode* Get()
  1611. {
  1612. if (mValsLeft == 0)
  1613. return NULL;
  1614. return *mPtr;
  1615. }
  1616. bool IsLast()
  1617. {
  1618. return mValsLeft == 1;
  1619. }
  1620. };
  1621. public:
  1622. BF_AST_TYPE(BfBlock, BfExpression);
  1623. ASTREF(BfTokenNode*) mOpenBrace;
  1624. ASTREF(BfTokenNode*) mCloseBrace;
  1625. //BfDebugArray<BfAstNode*> mChildArr;
  1626. BfSizedArray<ASTREF(BfAstNode*)> mChildArr;
  1627. int mParserBlockId;
  1628. public:
  1629. using BfAstNode::Init;
  1630. void Init(const SizedArrayImpl<BfAstNode*>& vec, BfAstAllocator* alloc);
  1631. BfAstNode* GetFirst();
  1632. BfAstNode* GetLast();
  1633. int GetSize();
  1634. void SetSize(int wantSize);
  1635. // virtual bool IsMissingSemicolon() override
  1636. // {
  1637. // return false;
  1638. // }
  1639. ASTREF(BfAstNode*)& operator[](int idx)
  1640. {
  1641. #ifdef BF_USE_NEAR_NODE_REF
  1642. BfSizedArray<ASTREF(BfAstNode*)>* childArr = &mChildArr;
  1643. while (true)
  1644. {
  1645. if (idx < childArr->mSize - 1)
  1646. return childArr->mVals[idx];
  1647. if (idx == childArr->mSize - 1)
  1648. {
  1649. auto& checkNode = childArr->mVals[childArr->mSize - 1];
  1650. if (!checkNode->IsA<BfBlockExtension>())
  1651. return checkNode;
  1652. }
  1653. idx -= childArr->mSize - 1;
  1654. BfBlockExtension* blockExt = (BfBlockExtension*)(BfAstNode*)childArr->mVals[childArr->mSize - 1];
  1655. BF_ASSERT(blockExt->GetTypeId() == BfBlockExtension::TypeId);
  1656. childArr = &blockExt->mChildArr;
  1657. }
  1658. #else
  1659. return mChildArr.mVals[idx];
  1660. #endif
  1661. }
  1662. Iterator begin()
  1663. {
  1664. return Iterator(mChildArr.mVals, mChildArr.mSize);
  1665. }
  1666. Iterator end()
  1667. {
  1668. return Iterator(NULL, 0);
  1669. }
  1670. }; BF_AST_DECL(BfBlock, BfExpression);
  1671. class BfUnscopedBlock : public BfBlock
  1672. {
  1673. public:
  1674. BF_AST_TYPE(BfUnscopedBlock, BfBlock);
  1675. }; BF_AST_DECL(BfUnscopedBlock, BfBlock);
  1676. class BfTypedValueExpression : public BfExpression
  1677. {
  1678. public:
  1679. BF_AST_TYPE(BfTypedValueExpression, BfExpression);
  1680. BfTypedValue mTypedValue;
  1681. BfAstNode* mRefNode;
  1682. public:
  1683. void Init(const BfTypedValue& typedValue)
  1684. {
  1685. mTypedValue = typedValue;
  1686. mRefNode = NULL;
  1687. #ifdef BF_AST_HAS_PARENT_MEMBER
  1688. mParent = NULL;
  1689. #endif
  1690. }
  1691. }; BF_AST_DECL(BfTypedValueExpression, BfExpression);
  1692. // Compound statements don't require semicolon termination
  1693. class BfCompoundStatement : public BfStatement
  1694. {
  1695. public:
  1696. BF_AST_TYPE(BfCompoundStatement, BfStatement);
  1697. }; BF_AST_DECL(BfCompoundStatement, BfStatement);
  1698. class BfLabelNode : public BfAstNode
  1699. {
  1700. public:
  1701. BF_AST_TYPE(BfLabelNode, BfAstNode);
  1702. BfIdentifierNode* mLabel;
  1703. BfTokenNode* mColonToken;
  1704. }; BF_AST_DECL(BfLabelNode, BfAstNode);
  1705. class BfLabelableStatement : public BfCompoundStatement
  1706. {
  1707. public:
  1708. BF_AST_TYPE(BfLabelableStatement, BfCompoundStatement);
  1709. BfLabelNode* mLabelNode;
  1710. }; BF_AST_DECL(BfLabelableStatement, BfCompoundStatement);
  1711. class BfLabeledBlock : public BfLabelableStatement
  1712. {
  1713. public:
  1714. BF_AST_TYPE(BfLabeledBlock, BfLabelableStatement);
  1715. BfBlock* mBlock;
  1716. }; BF_AST_DECL(BfLabeledBlock, BfLabelableStatement);
  1717. enum BfBinaryOp
  1718. {
  1719. BfBinaryOp_None,
  1720. BfBinaryOp_Add,
  1721. BfBinaryOp_Subtract,
  1722. BfBinaryOp_Multiply,
  1723. BfBinaryOp_OverflowAdd,
  1724. BfBinaryOp_OverflowSubtract,
  1725. BfBinaryOp_OverflowMultiply,
  1726. BfBinaryOp_Divide,
  1727. BfBinaryOp_Modulus,
  1728. BfBinaryOp_BitwiseAnd,
  1729. BfBinaryOp_BitwiseOr,
  1730. BfBinaryOp_ExclusiveOr,
  1731. BfBinaryOp_LeftShift,
  1732. BfBinaryOp_RightShift,
  1733. BfBinaryOp_Equality,
  1734. BfBinaryOp_StrictEquality,
  1735. BfBinaryOp_InEquality,
  1736. BfBinaryOp_StrictInEquality,
  1737. BfBinaryOp_GreaterThan,
  1738. BfBinaryOp_LessThan,
  1739. BfBinaryOp_GreaterThanOrEqual,
  1740. BfBinaryOp_LessThanOrEqual,
  1741. BfBinaryOp_Compare,
  1742. BfBinaryOp_ConditionalAnd,
  1743. BfBinaryOp_ConditionalOr,
  1744. BfBinaryOp_NullCoalesce,
  1745. BfBinaryOp_Is,
  1746. BfBinaryOp_As,
  1747. BfBinaryOp_Range,
  1748. BfBinaryOp_ClosedRange,
  1749. };
  1750. enum BfAssignmentOp
  1751. {
  1752. BfAssignmentOp_None,
  1753. BfAssignmentOp_Assign,
  1754. BfAssignmentOp_Add,
  1755. BfAssignmentOp_Subtract,
  1756. BfAssignmentOp_Multiply,
  1757. BfAssignmentOp_OverflowAdd,
  1758. BfAssignmentOp_OverflowSubtract,
  1759. BfAssignmentOp_OverflowMultiply,
  1760. BfAssignmentOp_Divide,
  1761. BfAssignmentOp_Modulus,
  1762. BfAssignmentOp_ShiftLeft,
  1763. BfAssignmentOp_ShiftRight,
  1764. BfAssignmentOp_BitwiseAnd,
  1765. BfAssignmentOp_BitwiseOr,
  1766. BfAssignmentOp_ExclusiveOr,
  1767. BfAssignmentOp_NullCoalesce
  1768. };
  1769. enum BfUnaryOp
  1770. {
  1771. BfUnaryOp_None,
  1772. BfUnaryOp_AddressOf,
  1773. BfUnaryOp_Arrow,
  1774. BfUnaryOp_Dereference,
  1775. BfUnaryOp_Negate,
  1776. BfUnaryOp_Not,
  1777. BfUnaryOp_Positive,
  1778. BfUnaryOp_InvertBits,
  1779. BfUnaryOp_Increment,
  1780. BfUnaryOp_Decrement,
  1781. BfUnaryOp_PostIncrement,
  1782. BfUnaryOp_PostDecrement,
  1783. BfUnaryOp_NullConditional,
  1784. BfUnaryOp_Ref,
  1785. BfUnaryOp_Out,
  1786. BfUnaryOp_Mut,
  1787. BfUnaryOp_Params,
  1788. BfUnaryOp_Cascade,
  1789. BfUnaryOp_FromEnd,
  1790. BfUnaryOp_PartialRangeUpTo,
  1791. BfUnaryOp_PartialRangeThrough,
  1792. BfUnaryOp_PartialRangeFrom,
  1793. };
  1794. class BfTokenNode : public BfAstNode
  1795. {
  1796. public:
  1797. BF_AST_TYPE(BfTokenNode, BfAstNode);
  1798. }; BF_AST_DECL(BfTokenNode, BfAstNode);
  1799. class BfScopeNode : public BfAstNode
  1800. {
  1801. public:
  1802. BF_AST_TYPE(BfScopeNode, BfAstNode);
  1803. BfTokenNode* mScopeToken;
  1804. BfTokenNode* mColonToken;
  1805. BfAstNode* mTargetNode; // . : or identifier
  1806. BfAttributeDirective* mAttributes;
  1807. BfAstNode* GetTargetNode()
  1808. {
  1809. if ((mColonToken != NULL) && (mColonToken->mToken == BfToken_ColonColon))
  1810. return mColonToken;
  1811. return mTargetNode;
  1812. }
  1813. }; BF_AST_DECL(BfScopeNode, BfAstNode);
  1814. class BfNewNode : public BfAstNode
  1815. {
  1816. public:
  1817. BF_AST_TYPE(BfNewNode, BfAstNode);
  1818. BfTokenNode* mNewToken;
  1819. BfTokenNode* mColonToken;
  1820. BfAstNode* mAllocNode; // Expression or BfScopedInvocationTarget
  1821. BfAttributeDirective* mAttributes;
  1822. }; BF_AST_DECL(BfNewNode, BfAstNode);
  1823. enum BfCommentKind
  1824. {
  1825. BfCommentKind_Line,
  1826. BfCommentKind_Block,
  1827. BfCommentKind_Documentation_Block_Pre,
  1828. BfCommentKind_Documentation_Line_Pre,
  1829. BfCommentKind_Documentation_Block_Post,
  1830. BfCommentKind_Documentation_Line_Post,
  1831. };
  1832. class BfCommentNode : public BfAstNode
  1833. {
  1834. public:
  1835. BF_AST_TYPE(BfCommentNode, BfAstNode);
  1836. BfCommentKind mCommentKind;
  1837. void GetDocString(StringImpl& docString)
  1838. {
  1839. ToString(docString);
  1840. for (int i = 0; i < (int)docString.length(); i++)
  1841. {
  1842. char c = docString[i];
  1843. if (c == '\n')
  1844. docString[i] = '\x3';
  1845. }
  1846. }
  1847. }; BF_AST_DECL(BfCommentNode, BfAstNode);
  1848. class BfPreprocesorIgnoredSectionNode : public BfAstNode
  1849. {
  1850. public:
  1851. BF_AST_TYPE(BfPreprocesorIgnoredSectionNode, BfAstNode);
  1852. }; BF_AST_DECL(BfPreprocesorIgnoredSectionNode, BfAstNode);
  1853. class BfPreprocessorNode : public BfAstNode
  1854. {
  1855. public:
  1856. BF_AST_TYPE(BfPreprocessorNode, BfAstNode);
  1857. BfIdentifierNode* mCommand;
  1858. BfBlock* mArgument;
  1859. }; BF_AST_DECL(BfPreprocessorNode, BfAstNode);
  1860. class BfPreprocessorDefinedExpression : public BfExpression
  1861. {
  1862. public:
  1863. BF_AST_TYPE(BfPreprocessorDefinedExpression, BfExpression);
  1864. BfIdentifierNode* mIdentifier;
  1865. }; BF_AST_DECL(BfPreprocessorDefinedExpression, BfExpression);
  1866. class BfReplaceNode : public BfAstNode
  1867. {
  1868. public:
  1869. BF_AST_TYPE(BfReplaceNode, BfAstNode);
  1870. }; BF_AST_DECL(BfReplaceNode, BfAstNode);
  1871. //TODO: Should we have a separate BfIdentifierExpression?
  1872. class BfIdentifierNode : public BfExpression
  1873. {
  1874. public:
  1875. BF_AST_TYPE(BfIdentifierNode, BfExpression);
  1876. }; BF_AST_DECL(BfIdentifierNode, BfExpression);
  1877. class BfAttributedIdentifierNode : public BfExpression
  1878. {
  1879. public:
  1880. BF_AST_TYPE(BfAttributedIdentifierNode, BfExpression);
  1881. BfIdentifierNode* mIdentifier;
  1882. BfAttributeDirective* mAttributes;
  1883. }; BF_AST_DECL(BfAttributedIdentifierNode, BfExpression);
  1884. class BfQualifiedNameNode : public BfIdentifierNode
  1885. {
  1886. public:
  1887. BF_AST_TYPE(BfQualifiedNameNode, BfIdentifierNode);
  1888. ASTREF(BfIdentifierNode*) mLeft;
  1889. ASTREF(BfTokenNode*) mDot;
  1890. ASTREF(BfIdentifierNode*) mRight;
  1891. bool IsGlobalLookup()
  1892. {
  1893. return (mDot != NULL) && (mDot->mToken == BfToken_ColonColon);
  1894. }
  1895. }; BF_AST_DECL(BfQualifiedNameNode, BfIdentifierNode);
  1896. class BfUsingDirective : public BfStatement
  1897. {
  1898. public:
  1899. BF_AST_TYPE(BfUsingDirective, BfStatement);
  1900. BfTokenNode* mUsingToken;
  1901. BfIdentifierNode* mNamespace;
  1902. }; BF_AST_DECL(BfUsingDirective, BfStatement);
  1903. class BfUsingModDirective : public BfStatement
  1904. {
  1905. public:
  1906. BF_AST_TYPE(BfUsingModDirective, BfStatement);
  1907. BfTokenNode* mUsingToken;
  1908. BfTokenNode* mModToken;
  1909. BfTypeReference* mTypeRef;
  1910. }; BF_AST_DECL(BfUsingModDirective, BfStatement);
  1911. class BfAttributeTargetSpecifier : public BfAstNode
  1912. {
  1913. public:
  1914. BF_AST_TYPE(BfAttributeTargetSpecifier, BfAstNode);
  1915. ASTREF(BfAstNode*) mTargetToken;
  1916. ASTREF(BfTokenNode*) mColonToken;
  1917. }; BF_AST_DECL(BfAttributeTargetSpecifier, BfAstNode);
  1918. class BfAttributeDirective : public BfAstNode
  1919. {
  1920. public:
  1921. BF_AST_TYPE(BfAttributeDirective, BfAstNode);
  1922. ASTREF(BfTokenNode*) mAttrOpenToken; // [ @ ,
  1923. ASTREF(BfTokenNode*) mAttrCloseToken;
  1924. ASTREF(BfAstNode*) mAttributeTargetSpecifier;
  1925. ASTREF(BfTypeReference*) mAttributeTypeRef;
  1926. ASTREF(BfTokenNode*) mCtorOpenParen;
  1927. ASTREF(BfTokenNode*) mCtorCloseParen;
  1928. BfSizedArray<ASTREF(BfExpression*)> mArguments;
  1929. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  1930. bool mIsMultiUse; // For anonymous types and also another use like a field decl
  1931. ASTREF(BfAttributeDirective*) mNextAttribute;
  1932. public:
  1933. bool Contains(const StringImpl& findName);
  1934. }; BF_AST_DECL(BfAttributeDirective, BfAstNode);
  1935. class BfNamespaceDeclaration : public BfAstNode
  1936. {
  1937. public:
  1938. BF_AST_TYPE(BfNamespaceDeclaration, BfAstNode);
  1939. BfTokenNode* mNamespaceNode;
  1940. BfIdentifierNode* mNameNode;
  1941. BfAstNode* mBody;
  1942. }; BF_AST_DECL(BfNamespaceDeclaration, BfAstNode);
  1943. class BfBinaryOperatorExpression : public BfExpression
  1944. {
  1945. public:
  1946. BF_AST_TYPE(BfBinaryOperatorExpression, BfExpression);
  1947. BfBinaryOp mOp;
  1948. ASTREF(BfTokenNode*) mOpToken;
  1949. ASTREF(BfExpression*) mLeft;
  1950. ASTREF(BfExpression*) mRight;
  1951. }; BF_AST_DECL(BfBinaryOperatorExpression, BfExpression);
  1952. class BfConditionalExpression : public BfExpression
  1953. {
  1954. public:
  1955. BF_AST_TYPE(BfConditionalExpression, BfExpression);
  1956. BfExpression* mConditionExpression;
  1957. BfTokenNode* mQuestionToken;
  1958. BfExpression* mTrueExpression;
  1959. BfTokenNode* mColonToken;
  1960. BfExpression* mFalseExpression;
  1961. }; BF_AST_DECL(BfConditionalExpression, BfExpression);
  1962. class BfAssignmentExpression : public BfExpression
  1963. {
  1964. public:
  1965. BF_AST_TYPE(BfAssignmentExpression, BfExpression);
  1966. BfAssignmentOp mOp;
  1967. ASTREF(BfTokenNode*) mOpToken;
  1968. ASTREF(BfExpression*) mLeft;
  1969. ASTREF(BfExpression*) mRight;
  1970. }; BF_AST_DECL(BfAssignmentExpression, BfExpression);
  1971. class BfMethodBoundExpression : public BfExpression
  1972. {
  1973. public:
  1974. BF_AST_TYPE(BfMethodBoundExpression, BfExpression);
  1975. }; BF_AST_DECL(BfMethodBoundExpression, BfExpression);
  1976. class BfIndexerExpression : public BfMethodBoundExpression
  1977. {
  1978. public:
  1979. BF_AST_TYPE(BfIndexerExpression, BfMethodBoundExpression);
  1980. BfExpression* mTarget;
  1981. BfTokenNode* mOpenBracket;
  1982. BfTokenNode* mCloseBracket;
  1983. BfSizedArray<ASTREF(BfExpression*)> mArguments;
  1984. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  1985. }; BF_AST_DECL(BfIndexerExpression, BfMethodBoundExpression);
  1986. class BfMemberReferenceExpression : public BfExpression
  1987. {
  1988. public:
  1989. BF_AST_TYPE(BfMemberReferenceExpression, BfExpression);
  1990. ASTREF(BfTokenNode*) mDotToken;
  1991. ASTREF(BfAstNode*) mTarget; // Can be expression or typeRef
  1992. ASTREF(BfAstNode*) mMemberName; // Either or BfIdentiferNode or a BfLiteralNode (for tuple "name.0" type lookups)
  1993. }; BF_AST_DECL(BfMemberReferenceExpression, BfExpression);
  1994. class BfUnaryOperatorExpression : public BfExpression
  1995. {
  1996. public:
  1997. BF_AST_TYPE(BfUnaryOperatorExpression, BfExpression);
  1998. BfUnaryOp mOp;
  1999. ASTREF(BfTokenNode*) mOpToken;
  2000. ASTREF(BfExpression*) mExpression;
  2001. }; BF_AST_DECL(BfUnaryOperatorExpression, BfExpression);
  2002. class BfMixinExpression : public BfExpression
  2003. {
  2004. public:
  2005. BF_AST_TYPE(BfMixinExpression, BfExpression);
  2006. }; BF_AST_DECL(BfMixinExpression, BfExpression);
  2007. class BfThisExpression : public BfExpression
  2008. {
  2009. public:
  2010. BF_AST_TYPE(BfThisExpression, BfExpression);
  2011. }; BF_AST_DECL(BfThisExpression, BfExpression);
  2012. class BfBaseExpression : public BfExpression
  2013. {
  2014. public:
  2015. BF_AST_TYPE(BfBaseExpression, BfExpression);
  2016. }; BF_AST_DECL(BfBaseExpression, BfExpression);
  2017. class BfLiteralExpression : public BfExpression
  2018. {
  2019. public:
  2020. BF_AST_TYPE(BfLiteralExpression, BfExpression);
  2021. BfVariant mValue;
  2022. }; BF_AST_DECL(BfLiteralExpression, BfExpression);
  2023. class BfStringInterpolationExpression : public BfExpression
  2024. {
  2025. public:
  2026. BF_AST_TYPE(BfStringInterpolationExpression, BfExpression);
  2027. BfAstNode* mAllocNode;
  2028. String* mString;
  2029. BfSizedArray<ASTREF(BfBlock*)> mExpressions;
  2030. }; BF_AST_DECL(BfStringInterpolationExpression, BfExpression);
  2031. class BfInitializerExpression : public BfExpression
  2032. {
  2033. public:
  2034. BF_AST_TYPE(BfInitializerExpression, BfExpression);
  2035. BfAstNode* mTarget;
  2036. BfTokenNode* mOpenBrace;
  2037. BfInlineTypeReference* mInlineTypeRef;
  2038. BfSizedArray<BfExpression*> mValues;
  2039. BfSizedArray<BfTokenNode*> mCommas;
  2040. BfTokenNode* mCloseBrace;
  2041. }; BF_AST_DECL(BfInitializerExpression, BfExpression);
  2042. class BfCollectionInitializerExpression : public BfExpression
  2043. {
  2044. public:
  2045. BF_AST_TYPE(BfCollectionInitializerExpression, BfExpression);
  2046. BfTokenNode* mOpenBrace;
  2047. BfSizedArray<ASTREF(BfExpression*)> mValues;
  2048. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  2049. BfTokenNode* mCloseBrace;
  2050. }; BF_AST_DECL(BfCollectionInitializerExpression, BfExpression);
  2051. class BfSizedArrayCreateExpression : public BfExpression
  2052. {
  2053. public:
  2054. BF_AST_TYPE(BfSizedArrayCreateExpression, BfExpression);
  2055. BfArrayTypeRef* mTypeRef;
  2056. BfCollectionInitializerExpression* mInitializer;
  2057. }; BF_AST_DECL(BfSizedArrayCreateExpression, BfExpression);
  2058. class BfParenthesizedExpression : public BfExpression
  2059. {
  2060. public:
  2061. BF_AST_TYPE(BfParenthesizedExpression, BfExpression);
  2062. BfTokenNode* mOpenParen;
  2063. BfExpression* mExpression;
  2064. BfTokenNode* mCloseParen;
  2065. }; BF_AST_DECL(BfParenthesizedExpression, BfExpression);
  2066. class BfTupleNameNode : public BfAstNode
  2067. {
  2068. public:
  2069. BF_AST_TYPE(BfTupleNameNode, BfAstNode);
  2070. BfIdentifierNode* mNameNode;
  2071. BfTokenNode* mColonToken;
  2072. }; BF_AST_DECL(BfTupleNameNode, BfAstNode);
  2073. class BfTupleExpression : public BfExpression
  2074. {
  2075. public:
  2076. BF_AST_TYPE(BfTupleExpression, BfExpression);
  2077. BfTokenNode* mOpenParen;
  2078. BfSizedArray<ASTREF(BfTupleNameNode*)> mNames;
  2079. BfSizedArray<ASTREF(BfExpression*)> mValues;
  2080. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  2081. ASTREF(BfTokenNode*) mCloseParen;
  2082. }; BF_AST_DECL(BfTupleExpression, BfExpression);
  2083. class BfWhenExpression : public BfExpression
  2084. {
  2085. public:
  2086. BF_AST_TYPE(BfWhenExpression, BfExpression);
  2087. BfTokenNode* mWhenToken;
  2088. BfExpression* mExpression;
  2089. }; BF_AST_DECL(BfWhenExpression, BfExpression);
  2090. class BfEnumCaseBindExpression : public BfExpression
  2091. {
  2092. public:
  2093. BF_AST_TYPE(BfEnumCaseBindExpression, BfExpression);
  2094. BfTokenNode* mBindToken; // Either 'var' or 'let'
  2095. BfAstNode* mEnumMemberExpr; // Either a BfMemberReferenceExpression or a BfIdentifierNode
  2096. BfTupleExpression* mBindNames;
  2097. }; BF_AST_DECL(BfEnumCaseBindExpression, BfExpression);
  2098. class BfCaseExpression : public BfExpression
  2099. {
  2100. public:
  2101. BF_AST_TYPE(BfCaseExpression, BfExpression);
  2102. BfAstNode* mNotToken;
  2103. BfTokenNode* mCaseToken;
  2104. BfExpression* mCaseExpression;
  2105. BfTokenNode* mEqualsNode;
  2106. BfExpression* mValueExpression;
  2107. }; BF_AST_DECL(BfCaseExpression, BfExpression);
  2108. class BfSwitchCase : public BfAstNode
  2109. {
  2110. public:
  2111. BF_AST_TYPE(BfSwitchCase, BfAstNode);
  2112. BfTokenNode* mCaseToken;
  2113. BfSizedArray<ASTREF(BfExpression*)> mCaseExpressions;
  2114. BfSizedArray<ASTREF(BfTokenNode*)> mCaseCommas;
  2115. BfTokenNode* mColonToken;
  2116. BfBlock* mCodeBlock; // May or may not have braces set
  2117. BfTokenNode* mEndingToken; // Null, Fallthrough, or Break
  2118. BfTokenNode* mEndingSemicolonToken;
  2119. }; BF_AST_DECL(BfSwitchCase, BfAstNode);
  2120. class BfSwitchStatement : public BfLabelableStatement
  2121. {
  2122. public:
  2123. BF_AST_TYPE(BfSwitchStatement, BfLabelableStatement);
  2124. BfTokenNode* mSwitchToken;
  2125. BfTokenNode* mOpenParen;
  2126. BfExpression* mSwitchValue;
  2127. BfTokenNode* mCloseParen;
  2128. BfTokenNode* mOpenBrace;
  2129. BfSizedArray<ASTREF(BfSwitchCase*)> mSwitchCases;
  2130. BfSwitchCase* mDefaultCase;
  2131. BfTokenNode* mCloseBrace;
  2132. }; BF_AST_DECL(BfSwitchStatement, BfLabelableStatement);
  2133. class BfIfStatement : public BfLabelableStatement
  2134. {
  2135. public:
  2136. BF_AST_TYPE(BfIfStatement, BfLabelableStatement);
  2137. BfTokenNode* mIfToken;
  2138. BfTokenNode* mOpenParen;
  2139. BfExpression* mCondition;
  2140. BfTokenNode* mCloseParen;
  2141. BfAstNode* mTrueStatement;
  2142. BfTokenNode* mElseToken;
  2143. BfAstNode* mFalseStatement;
  2144. }; BF_AST_DECL(BfIfStatement, BfLabelableStatement);
  2145. class BfEmptyStatement : public BfStatement
  2146. {
  2147. public:
  2148. BF_AST_TYPE(BfEmptyStatement, BfStatement);
  2149. }; BF_AST_DECL(BfEmptyStatement, BfStatement);
  2150. class BfRootNode : public BfBlock
  2151. {
  2152. public:
  2153. BF_AST_TYPE(BfRootNode, BfBlock);
  2154. }; BF_AST_DECL(BfRootNode, BfBlock);
  2155. class BfGenericConstraintsDeclaration;
  2156. class BfTypeDeclaration : public BfAstNode
  2157. {
  2158. public:
  2159. BF_AST_TYPE(BfTypeDeclaration, BfAstNode);
  2160. BfCommentNode* mDocumentation;
  2161. BfAttributeDirective* mAttributes;
  2162. BfTokenNode* mAbstractSpecifier;
  2163. BfTokenNode* mSealedSpecifier;
  2164. BfAstNode* mProtectionSpecifier;
  2165. BfTokenNode* mStaticSpecifier;
  2166. BfTokenNode* mPartialSpecifier;
  2167. BfTokenNode* mTypeNode;
  2168. BfIdentifierNode* mNameNode;
  2169. BfAstNode* mDefineNode;
  2170. BfAutoConstructorDeclaration* mAutoCtor;
  2171. BfGenericParamsDeclaration* mGenericParams;
  2172. BfGenericConstraintsDeclaration* mGenericConstraintsDeclaration;
  2173. bool mIgnoreDeclaration;
  2174. char* mAnonymousName;
  2175. BfTokenNode* mColonToken;
  2176. BfSizedArray<ASTREF(BfTypeReference*)> mBaseClasses;
  2177. BfSizedArray<ASTREF(BfAstNode*)> mBaseClassCommas;
  2178. BfSizedArray<BfTypeDeclaration*> mAnonymousTypes;
  2179. bool IsAnonymous();
  2180. bool IsAnonymousInitializerType();
  2181. }; BF_AST_DECL(BfTypeDeclaration, BfAstNode);
  2182. class BfInitializerTypeDeclaration : public BfTypeDeclaration
  2183. {
  2184. public:
  2185. BF_AST_TYPE(BfInitializerTypeDeclaration, BfTypeDeclaration);
  2186. }; BF_AST_DECL(BfInitializerTypeDeclaration, BfTypeDeclaration);
  2187. class BfTypeAliasDeclaration : public BfTypeDeclaration
  2188. {
  2189. public:
  2190. BF_AST_TYPE(BfTypeAliasDeclaration, BfTypeDeclaration);
  2191. BfTokenNode* mEqualsToken;
  2192. BfTypeReference* mAliasToType;
  2193. BfTokenNode* mEndSemicolon;
  2194. }; BF_AST_DECL(BfTypeAliasDeclaration, BfTypeDeclaration);
  2195. class BfTypeReference : public BfAstNode
  2196. {
  2197. public:
  2198. BF_AST_TYPE(BfTypeReference, BfAstNode);
  2199. bool IsNamedTypeReference();
  2200. bool IsTypeDefTypeReference();
  2201. String ToCleanAttributeString();
  2202. }; BF_AST_DECL(BfTypeReference, BfAstNode);
  2203. class BfInlineTypeReference : public BfTypeReference
  2204. {
  2205. public:
  2206. BF_AST_TYPE(BfInlineTypeReference, BfTypeReference);
  2207. BfTypeDeclaration* mTypeDeclaration;
  2208. }; BF_AST_DECL(BfInlineTypeReference, BfTypeReference);
  2209. class BfDirectTypeReference : public BfTypeReference
  2210. {
  2211. public:
  2212. BF_AST_TYPE(BfDirectTypeReference, BfAstNode);
  2213. BfType* mType;
  2214. void Init(BfType* type)
  2215. {
  2216. mType = type;
  2217. InitEmpty();
  2218. }
  2219. }; BF_AST_DECL(BfDirectTypeReference, BfAstNode);
  2220. class BfDirectTypeDefReference : public BfTypeReference
  2221. {
  2222. public:
  2223. BF_AST_TYPE(BfDirectTypeDefReference, BfTypeReference);
  2224. BfTypeDef* mTypeDef;
  2225. void Init(BfTypeDef* type)
  2226. {
  2227. mTypeDef = type;
  2228. InitEmpty();
  2229. }
  2230. }; BF_AST_DECL(BfDirectTypeDefReference, BfTypeReference);
  2231. // class BfTypeDefTypeReference : public BfTypeReference
  2232. // {
  2233. // public:
  2234. // BF_AST_TYPE(BfTypeDefTypeReference, BfTypeReference);
  2235. //
  2236. // BfTypeDef* mTypeDef;
  2237. // }; BF_AST_DECL(BfTypeDefTypeReference, BfTypeReference);
  2238. class BfDirectStrTypeReference : public BfTypeReference
  2239. {
  2240. public:
  2241. BF_AST_TYPE(BfDirectStrTypeReference, BfTypeReference);
  2242. String mTypeName;
  2243. using BfAstNode::Init;
  2244. void Init(const StringImpl& str)
  2245. {
  2246. mTypeName = str;
  2247. #ifdef BF_AST_HAS_PARENT_MEMBER
  2248. mParent = NULL;
  2249. #endif
  2250. InitEmpty();
  2251. //mTypeDef = NULL;
  2252. }
  2253. }; BF_AST_DECL(BfDirectStrTypeReference, BfTypeReference);
  2254. class BfDotTypeReference : public BfTypeReference
  2255. {
  2256. public:
  2257. BF_AST_TYPE(BfDotTypeReference, BfTypeReference);
  2258. BfTokenNode* mDotToken;
  2259. }; BF_AST_DECL(BfDotTypeReference, BfTypeReference);
  2260. class BfVarTypeReference : public BfTypeReference
  2261. {
  2262. public:
  2263. BF_AST_TYPE(BfVarTypeReference, BfTypeReference);
  2264. BfTokenNode* mVarToken;
  2265. }; BF_AST_DECL(BfVarTypeReference, BfTypeReference);
  2266. class BfVarRefTypeReference : public BfTypeReference
  2267. {
  2268. public:
  2269. BF_AST_TYPE(BfVarRefTypeReference, BfTypeReference);
  2270. BfTokenNode* mVarToken;
  2271. BfTokenNode* mRefToken;
  2272. }; BF_AST_DECL(BfVarRefTypeReference, BfTypeReference);
  2273. class BfLetTypeReference : public BfTypeReference
  2274. {
  2275. public:
  2276. BF_AST_TYPE(BfLetTypeReference, BfTypeReference);
  2277. BfTokenNode* mLetToken;
  2278. }; BF_AST_DECL(BfLetTypeReference, BfTypeReference);
  2279. class BfWildcardTypeReference : public BfTypeReference
  2280. {
  2281. public:
  2282. BF_AST_TYPE(BfWildcardTypeReference, BfTypeReference);
  2283. BfTokenNode* mWildcardToken;
  2284. }; BF_AST_DECL(BfWildcardTypeReference, BfTypeReference);
  2285. class BfQualifiedTypeReference : public BfTypeReference
  2286. {
  2287. public:
  2288. BF_AST_TYPE(BfQualifiedTypeReference, BfTypeReference);
  2289. ASTREF(BfTypeReference*) mLeft;
  2290. ASTREF(BfTokenNode*) mDot;
  2291. ASTREF(BfTypeReference*) mRight;
  2292. bool IsGlobalLookup()
  2293. {
  2294. return (mDot != NULL) && (mDot->mToken == BfToken_ColonColon);
  2295. }
  2296. }; BF_AST_DECL(BfQualifiedTypeReference, BfTypeReference);
  2297. class BfResolvedTypeReference : public BfTypeReference
  2298. {
  2299. public:
  2300. BF_AST_TYPE(BfResolvedTypeReference, BfTypeReference);
  2301. BfType* mType;
  2302. }; BF_AST_DECL(BfResolvedTypeReference, BfTypeReference);
  2303. // "Named" means no wrapping (ie: not array, not generic instance, not pointer, etc
  2304. class BfNamedTypeReference : public BfTypeReference
  2305. {
  2306. public:
  2307. BF_AST_TYPE(BfNamedTypeReference, BfTypeReference);
  2308. ASTREF(BfIdentifierNode*) mNameNode;
  2309. }; BF_AST_DECL(BfNamedTypeReference, BfTypeReference);
  2310. class BfElementedTypeRef : public BfTypeReference
  2311. {
  2312. public:
  2313. BF_AST_TYPE(BfElementedTypeRef, BfTypeReference);
  2314. ASTREF(BfTypeReference*) mElementType;
  2315. }; BF_AST_DECL(BfElementedTypeRef, BfTypeReference);
  2316. class BfModifiedTypeRef : public BfElementedTypeRef
  2317. {
  2318. public:
  2319. BF_AST_TYPE(BfModifiedTypeRef, BfElementedTypeRef);
  2320. BfTokenNode* mRetTypeToken;
  2321. BfTokenNode* mOpenParen;
  2322. BfTokenNode* mCloseParen;
  2323. }; BF_AST_DECL(BfModifiedTypeRef, BfElementedTypeRef);
  2324. class BfArrayTypeRef : public BfElementedTypeRef
  2325. {
  2326. public:
  2327. BF_AST_TYPE(BfArrayTypeRef, BfElementedTypeRef);
  2328. int mDimensions;
  2329. BfTokenNode* mOpenBracket;
  2330. BfSizedArray<ASTREF(BfAstNode*)> mParams; // Either commas or constant size expression
  2331. BfTokenNode* mCloseBracket;
  2332. bool IsInferredSize()
  2333. {
  2334. if (mParams.mSize > 0)
  2335. return BfNodeIsA<BfUninitializedExpression>(mParams[0]);
  2336. return false;
  2337. }
  2338. }; BF_AST_DECL(BfArrayTypeRef, BfElementedTypeRef);
  2339. class BfNullableTypeRef : public BfElementedTypeRef
  2340. {
  2341. public:
  2342. BF_AST_TYPE(BfNullableTypeRef, BfElementedTypeRef);
  2343. BfTokenNode* mQuestionToken;
  2344. }; BF_AST_DECL(BfNullableTypeRef, BfElementedTypeRef);
  2345. class BfGenericInstanceTypeRef : public BfElementedTypeRef
  2346. {
  2347. public:
  2348. BF_AST_TYPE(BfGenericInstanceTypeRef, BfElementedTypeRef);
  2349. BfTokenNode* mOpenChevron;
  2350. BfSizedArray<BfAstNode*> mGenericArguments;
  2351. BfSizedArray<ASTREF(BfAstNode*)> mCommas;
  2352. BfTokenNode* mCloseChevron;
  2353. int GetGenericArgCount()
  2354. {
  2355. if (!mCommas.empty())
  2356. return (int)mCommas.size() + 1;
  2357. return std::max(1, (int)mGenericArguments.size());
  2358. }
  2359. }; BF_AST_DECL(BfGenericInstanceTypeRef, BfElementedTypeRef);
  2360. class BfTupleTypeRef : public BfElementedTypeRef
  2361. {
  2362. public:
  2363. BF_AST_TYPE(BfTupleTypeRef, BfElementedTypeRef);
  2364. ASTREF(BfTokenNode*) mOpenParen;
  2365. BfSizedArray<ASTREF(BfTypeReference*)> mFieldTypes;
  2366. BfSizedArray<ASTREF(BfIdentifierNode*)> mFieldNames;
  2367. BfSizedArray<ASTREF(BfAstNode*)> mCommas;
  2368. ASTREF(BfTokenNode*) mCloseParen;
  2369. int GetGenericArgCount()
  2370. {
  2371. if (!mCommas.empty())
  2372. return (int)mCommas.size() + 1;
  2373. return std::max(1, (int)mFieldTypes.size());
  2374. }
  2375. }; BF_AST_DECL(BfTupleTypeRef, BfElementedTypeRef);
  2376. class BfTagTypeRef : public BfTypeReference
  2377. {
  2378. public:
  2379. BF_AST_TYPE(BfTagTypeRef, BfTypeReference);
  2380. BfIdentifierNode* mTagNode;
  2381. BfIdentifierNode* mNameNode;
  2382. }; BF_AST_DECL(BfTagTypeRef, BfTypeReference);
  2383. class BfDelegateTypeRef : public BfTypeReference
  2384. {
  2385. public:
  2386. BF_AST_TYPE(BfDelegateTypeRef, BfTypeReference);
  2387. BfTokenNode* mTypeToken; // Delegate or Function
  2388. BfAttributeDirective* mAttributes;
  2389. BfTypeReference* mReturnType;
  2390. BfAstNode* mOpenParen;
  2391. BfSizedArray<BfParameterDeclaration*> mParams;
  2392. BfSizedArray<BfTokenNode*> mCommas;
  2393. BfAstNode* mCloseParen;
  2394. }; BF_AST_DECL(BfDelegateTypeRef, BfTypeReference);
  2395. class BfExprModTypeRef : public BfTypeReference
  2396. {
  2397. public:
  2398. BF_AST_TYPE(BfExprModTypeRef, BfTypeReference);
  2399. BfTokenNode* mToken;
  2400. BfTokenNode* mOpenParen;
  2401. BfExpression* mTarget;
  2402. BfTokenNode* mCloseParen;
  2403. }; BF_AST_DECL(BfExprModTypeRef, BfTypeReference);
  2404. enum BfGenericParamKind
  2405. {
  2406. BfGenericParamKind_Type,
  2407. BfGenericParamKind_Method
  2408. };
  2409. class BfGenericParamTypeRef : public BfTypeReference
  2410. {
  2411. public:
  2412. BF_AST_TYPE(BfGenericParamTypeRef, BfTypeReference);
  2413. BfGenericParamKind mGenericParamKind;
  2414. int mGenericParamIdx;
  2415. }; BF_AST_DECL(BfGenericParamTypeRef, BfTypeReference);
  2416. class BfPointerTypeRef : public BfElementedTypeRef
  2417. {
  2418. public:
  2419. BF_AST_TYPE(BfPointerTypeRef, BfElementedTypeRef);
  2420. BfTokenNode* mStarNode;
  2421. }; BF_AST_DECL(BfPointerTypeRef, BfElementedTypeRef);
  2422. class BfConstTypeRef : public BfElementedTypeRef
  2423. {
  2424. public:
  2425. BF_AST_TYPE(BfConstTypeRef, BfElementedTypeRef);
  2426. BfTokenNode* mConstToken;
  2427. }; BF_AST_DECL(BfConstTypeRef, BfElementedTypeRef);
  2428. class BfConstExprTypeRef : public BfTypeReference
  2429. {
  2430. public:
  2431. BF_AST_TYPE(BfConstExprTypeRef, BfTypeReference);
  2432. BfTokenNode* mConstToken;
  2433. BfExpression* mConstExpr;
  2434. }; BF_AST_DECL(BfConstExprTypeRef, BfTypeReference);
  2435. class BfUnsignedTypeRef : public BfElementedTypeRef
  2436. {
  2437. public:
  2438. BF_AST_TYPE(BfUnsignedTypeRef, BfElementedTypeRef);
  2439. BfTokenNode* mUnsignedToken;
  2440. }; BF_AST_DECL(BfUnsignedTypeRef, BfElementedTypeRef);
  2441. class BfRefTypeRef : public BfElementedTypeRef
  2442. {
  2443. public:
  2444. BF_AST_TYPE(BfRefTypeRef, BfElementedTypeRef);
  2445. BfTokenNode* mRefToken;
  2446. }; BF_AST_DECL(BfRefTypeRef, BfElementedTypeRef);
  2447. class BfTypeAttrExpression : public BfExpression
  2448. {
  2449. public:
  2450. BF_AST_TYPE(BfTypeAttrExpression, BfExpression);
  2451. BfTokenNode* mToken;
  2452. BfTokenNode* mOpenParen;
  2453. BfTypeReference* mTypeRef;
  2454. BfTokenNode* mCloseParen;
  2455. }; BF_AST_DECL(BfTypeAttrExpression, BfExpression);
  2456. class BfTypeOfExpression : public BfTypeAttrExpression
  2457. {
  2458. public:
  2459. BF_AST_TYPE(BfTypeOfExpression, BfTypeAttrExpression);
  2460. }; BF_AST_DECL(BfTypeOfExpression, BfTypeAttrExpression);
  2461. class BfSizeOfExpression : public BfTypeAttrExpression
  2462. {
  2463. public:
  2464. BF_AST_TYPE(BfSizeOfExpression, BfTypeAttrExpression);
  2465. }; BF_AST_DECL(BfSizeOfExpression, BfTypeAttrExpression);
  2466. class BfAlignOfExpression : public BfTypeAttrExpression
  2467. {
  2468. public:
  2469. BF_AST_TYPE(BfAlignOfExpression, BfTypeAttrExpression);
  2470. }; BF_AST_DECL(BfAlignOfExpression, BfTypeAttrExpression);
  2471. class BfStrideOfExpression : public BfTypeAttrExpression
  2472. {
  2473. public:
  2474. BF_AST_TYPE(BfStrideOfExpression, BfTypeAttrExpression);
  2475. }; BF_AST_DECL(BfStrideOfExpression, BfTypeAttrExpression);
  2476. class BfOffsetOfExpression : public BfTypeAttrExpression
  2477. {
  2478. public:
  2479. BF_AST_TYPE(BfOffsetOfExpression, BfTypeAttrExpression);
  2480. BfTokenNode* mCommaToken;
  2481. BfIdentifierNode* mMemberName;
  2482. }; BF_AST_DECL(BfOffsetOfExpression, BfTypeAttrExpression);
  2483. class BfNameOfExpression : public BfExpression
  2484. {
  2485. public:
  2486. BF_AST_TYPE(BfNameOfExpression, BfExpression);
  2487. BfTokenNode* mToken;
  2488. BfTokenNode* mOpenParen;
  2489. BfAstNode* mTarget;
  2490. BfTokenNode* mCloseParen;
  2491. }; BF_AST_DECL(BfNameOfExpression, BfExpression);
  2492. class BfIsConstExpression : public BfExpression
  2493. {
  2494. public:
  2495. BF_AST_TYPE(BfIsConstExpression, BfTypeAttrExpression);
  2496. BfTokenNode* mIsConstToken;
  2497. BfTokenNode* mOpenParen;
  2498. BfExpression* mExpression;
  2499. BfTokenNode* mCloseParen;
  2500. }; BF_AST_DECL(BfIsConstExpression, BfTypeAttrExpression);
  2501. class BfDefaultExpression : public BfExpression
  2502. {
  2503. public:
  2504. BF_AST_TYPE(BfDefaultExpression, BfExpression);
  2505. BfTokenNode* mDefaultToken;
  2506. BfTokenNode* mOpenParen;
  2507. BfTypeReference* mTypeRef;
  2508. BfTokenNode* mCloseParen;
  2509. }; BF_AST_DECL(BfDefaultExpression, BfExpression);
  2510. class BfUninitializedExpression : public BfExpression
  2511. {
  2512. public:
  2513. BF_AST_TYPE(BfUninitializedExpression, BfExpression);
  2514. BfTokenNode* mQuestionToken;
  2515. }; BF_AST_DECL(BfUninitializedExpression, BfExpression);
  2516. class BfCheckTypeExpression : public BfExpression
  2517. {
  2518. public:
  2519. BF_AST_TYPE(BfCheckTypeExpression, BfExpression);
  2520. BfExpression* mTarget;
  2521. BfTokenNode* mIsToken;
  2522. BfTypeReference* mTypeRef;
  2523. }; BF_AST_DECL(BfCheckTypeExpression, BfExpression);
  2524. class BfDynamicCastExpression : public BfExpression
  2525. {
  2526. public:
  2527. BF_AST_TYPE(BfDynamicCastExpression, BfExpression);
  2528. BfExpression* mTarget;
  2529. BfTokenNode* mAsToken;
  2530. BfTypeReference* mTypeRef;
  2531. }; BF_AST_DECL(BfDynamicCastExpression, BfExpression);
  2532. class BfCastExpression : public BfUnaryOperatorExpression
  2533. {
  2534. public:
  2535. BF_AST_TYPE(BfCastExpression, BfUnaryOperatorExpression);
  2536. BfTokenNode* mOpenParen;
  2537. BfTypeReference* mTypeRef;
  2538. BfTokenNode* mCloseParen;
  2539. }; BF_AST_DECL(BfCastExpression, BfUnaryOperatorExpression);
  2540. class BfDelegateBindExpression : public BfMethodBoundExpression
  2541. {
  2542. public:
  2543. BF_AST_TYPE(BfDelegateBindExpression, BfMethodBoundExpression);
  2544. BfAstNode* mNewToken;
  2545. BfTokenNode* mFatArrowToken;
  2546. BfExpression* mTarget;
  2547. BfGenericArgumentsNode* mGenericArgs;
  2548. }; BF_AST_DECL(BfDelegateBindExpression, BfMethodBoundExpression);
  2549. class BfLambdaBindExpression : public BfExpression
  2550. {
  2551. public:
  2552. BF_AST_TYPE(BfLambdaBindExpression, BfExpression);
  2553. BfAstNode* mNewToken;
  2554. BfTokenNode* mOpenParen;
  2555. BfTokenNode* mCloseParen;
  2556. BfSizedArray<ASTREF(BfIdentifierNode*)> mParams;
  2557. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  2558. BfTokenNode* mFatArrowToken;
  2559. BfAstNode* mBody; // Either expression or block
  2560. BfFieldDtorDeclaration* mDtor;
  2561. }; BF_AST_DECL(BfLambdaBindExpression, BfExpression);
  2562. class BfNamedExpression : public BfExpression
  2563. {
  2564. public:
  2565. BF_AST_TYPE(BfNamedExpression, BfExpression);
  2566. BfIdentifierNode* mNameNode;
  2567. BfTokenNode* mColonToken;
  2568. BfExpression* mExpression;
  2569. }; BF_AST_DECL(BfNamedExpression, BfExpression);
  2570. class BfAttributedExpression : public BfExpression
  2571. {
  2572. public:
  2573. BF_AST_TYPE(BfAttributedExpression, BfExpression);
  2574. BfAttributeDirective* mAttributes;
  2575. BfExpression* mExpression;
  2576. }; BF_AST_DECL(BfAttributedExpression, BfExpression);
  2577. class BfAttributedStatement : public BfStatement
  2578. {
  2579. public:
  2580. BF_AST_TYPE(BfAttributedStatement, BfStatement);
  2581. BfAttributeDirective* mAttributes;
  2582. BfAstNode* mStatement;
  2583. }; BF_AST_DECL(BfAttributedStatement, BfStatement);
  2584. class BfCtorExplicitNode : public BfAstNode
  2585. {
  2586. public:
  2587. BF_AST_TYPE(BfCtorExplicitNode, BfAstNode);
  2588. BfAstNode* mDotToken;
  2589. BfTokenNode* mThisToken;
  2590. BfGenericArgumentsNode* mGenericArgs;
  2591. }; BF_AST_DECL(BfCtorExplicitNode, BfAstNode);
  2592. class BfObjectCreateExpression : public BfMethodBoundExpression
  2593. {
  2594. public:
  2595. BF_AST_TYPE(BfObjectCreateExpression, BfMethodBoundExpression);
  2596. BfAstNode* mNewNode;
  2597. BfTokenNode* mStarToken;
  2598. BfTypeReference* mTypeRef;
  2599. BfCtorExplicitNode* mCtorExplicit;
  2600. BfTokenNode* mOpenToken;
  2601. BfTokenNode* mCloseToken;
  2602. BfSizedArray<BfExpression*> mArguments;
  2603. BfSizedArray<BfTokenNode*> mCommas;
  2604. }; BF_AST_DECL(BfObjectCreateExpression, BfMethodBoundExpression);
  2605. class BfExtendExpression : public BfExpression
  2606. {
  2607. public:
  2608. BF_AST_TYPE(BfExtendExpression, BfExpression);
  2609. BfAstNode* mTarget;
  2610. BfTypeDeclaration* mTypeDecl;
  2611. }; BF_AST_DECL(BfExtendExpression, BfExpression);
  2612. class BfBoxExpression : public BfExpression
  2613. {
  2614. public:
  2615. BF_AST_TYPE(BfBoxExpression, BfExpression);
  2616. BfAstNode* mAllocNode;
  2617. BfTokenNode* mBoxToken;
  2618. BfExpression* mExpression;
  2619. }; BF_AST_DECL(BfBoxExpression, BfExpression);
  2620. class BfDeleteStatement : public BfStatement
  2621. {
  2622. public:
  2623. BF_AST_TYPE(BfDeleteStatement, BfStatement);
  2624. BfTokenNode* mDeleteToken;
  2625. BfTokenNode* mTargetTypeToken; // colon token
  2626. BfAstNode* mAllocExpr;
  2627. BfAttributeDirective* mAttributes;
  2628. BfExpression* mExpression;
  2629. }; BF_AST_DECL(BfDeleteStatement, BfStatement);
  2630. class BfDeferBindNode : public BfAstNode
  2631. {
  2632. public:
  2633. BF_AST_TYPE(BfDeferBindNode, BfAstNode);
  2634. BfTokenNode* mOpenBracket;
  2635. BfTokenNode* mCloseBracket;
  2636. BfSizedArray<ASTREF(BfIdentifierNode*)> mParams;
  2637. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  2638. }; BF_AST_DECL(BfDeferBindNode, BfAstNode);
  2639. class BfDeferStatement : public BfStatement
  2640. {
  2641. public:
  2642. BF_AST_TYPE(BfDeferStatement, BfStatement);
  2643. BfTokenNode* mDeferToken;
  2644. BfTokenNode* mColonToken;
  2645. BfAstNode* mScopeName; // :, mixin, or identifier
  2646. BfDeferBindNode* mBind;
  2647. //Legacy compat, remove
  2648. BfTokenNode* mOpenParen;
  2649. BfTokenNode* mScopeToken;
  2650. BfTokenNode* mCloseParen;
  2651. BfAstNode* mTargetNode;
  2652. BfAstNode* GetScopeNameNode()
  2653. {
  2654. if ((mColonToken != NULL) && (mColonToken->mToken == BfToken_ColonColon))
  2655. return mColonToken;
  2656. return mScopeName;
  2657. }
  2658. // virtual bool IsMissingSemicolon() override
  2659. // {
  2660. // return BfNodeDynCastExact<BfBlock>(mTargetNode) == NULL;
  2661. // }
  2662. }; BF_AST_DECL(BfDeferStatement, BfStatement);
  2663. class BfThrowStatement : public BfStatement
  2664. {
  2665. public:
  2666. BF_AST_TYPE(BfThrowStatement, BfStatement);
  2667. BfTokenNode* mThrowToken;
  2668. BfExpression* mExpression;
  2669. }; BF_AST_DECL(BfThrowStatement, BfStatement);
  2670. class BfScopedInvocationTarget : public BfAstNode
  2671. {
  2672. public:
  2673. BF_AST_TYPE(BfScopedInvocationTarget, BfAstNode);
  2674. BfAstNode* mTarget;
  2675. BfTokenNode* mColonToken;
  2676. BfAstNode* mScopeName; // :, mixin, or identifier
  2677. BfAstNode* GetScopeNameNode()
  2678. {
  2679. if ((mColonToken != NULL) && (mColonToken->mToken == BfToken_ColonColon))
  2680. return mColonToken;
  2681. return mScopeName;
  2682. }
  2683. }; BF_AST_DECL(BfScopedInvocationTarget, BfAstNode);
  2684. class BfInvocationExpression : public BfMethodBoundExpression
  2685. {
  2686. public:
  2687. BF_AST_TYPE(BfInvocationExpression, BfMethodBoundExpression);
  2688. ASTREF(BfAstNode*) mTarget;
  2689. ASTREF(BfTokenNode*) mOpenParen;
  2690. ASTREF(BfTokenNode*) mCloseParen;
  2691. ASTREF(BfGenericArgumentsNode*) mGenericArgs;
  2692. BfSizedArray<ASTREF(BfExpression*)> mArguments;
  2693. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  2694. }; BF_AST_DECL(BfInvocationExpression, BfMethodBoundExpression);
  2695. class BfEnumCaseDeclaration : public BfAstNode
  2696. {
  2697. public:
  2698. BF_AST_TYPE(BfEnumCaseDeclaration, BfAstNode);
  2699. ASTREF(BfTokenNode*) mCaseToken;
  2700. BfSizedArray<ASTREF(BfFieldDeclaration*)> mEntries;
  2701. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  2702. }; BF_AST_DECL(BfEnumCaseDeclaration, BfAstNode);
  2703. class BfMemberDeclaration : public BfAstNode
  2704. {
  2705. public:
  2706. BF_AST_TYPE(BfMemberDeclaration, BfAstNode);
  2707. BfAttributeDirective* mAttributes;
  2708. BfAstNode* mProtectionSpecifier;
  2709. BfTokenNode* mStaticSpecifier;
  2710. BfTokenNode* mReadOnlySpecifier; // Also stores 'inline'
  2711. }; BF_AST_DECL(BfMemberDeclaration, BfAstNode);
  2712. class BfVariableDeclaration : public BfExpression
  2713. {
  2714. public:
  2715. BF_AST_TYPE(BfVariableDeclaration, BfExpression);
  2716. ASTREF(BfAttributeDirective*) mAttributes;
  2717. ASTREF(BfTokenNode*) mModSpecifier;
  2718. ASTREF(BfTypeReference*) mTypeRef;
  2719. ASTREF(BfTokenNode*) mPrecedingComma;
  2720. BfAstNode* mNameNode; // Either BfIdentifierNode or BfTupleExpression
  2721. ASTREF(BfTokenNode*) mEqualsNode;
  2722. ASTREF(BfExpression*) mInitializer;
  2723. }; BF_AST_DECL(BfVariableDeclaration, BfExpression);
  2724. class BfLocalMethodDeclaration : public BfCompoundStatement
  2725. {
  2726. public:
  2727. BF_AST_TYPE(BfLocalMethodDeclaration, BfCompoundStatement);
  2728. BfMethodDeclaration* mMethodDeclaration;
  2729. }; BF_AST_DECL(BfLocalMethodDeclaration, BfCompoundStatement);
  2730. class BfParameterDeclaration : public BfVariableDeclaration
  2731. {
  2732. public:
  2733. BF_AST_TYPE(BfParameterDeclaration, BfVariableDeclaration);
  2734. BfTokenNode* mModToken; // 'Params'
  2735. }; BF_AST_DECL(BfParameterDeclaration, BfVariableDeclaration);
  2736. class BfGenericParamsDeclaration : public BfAstNode
  2737. {
  2738. public:
  2739. BF_AST_TYPE(BfGenericParamsDeclaration, BfAstNode);
  2740. ASTREF(BfTokenNode*) mOpenChevron;
  2741. BfSizedArray<ASTREF(BfIdentifierNode*)> mGenericParams;
  2742. BfSizedArray<ASTREF(BfAstNode*)> mCommas;
  2743. ASTREF(BfTokenNode*) mCloseChevron;
  2744. }; BF_AST_DECL(BfGenericParamsDeclaration, BfAstNode);
  2745. class BfGenericArgumentsNode : public BfAstNode
  2746. {
  2747. public:
  2748. BF_AST_TYPE(BfGenericArgumentsNode, BfAstNode);
  2749. ASTREF(BfTokenNode*) mOpenChevron;
  2750. BfSizedArray<ASTREF(BfAstNode*)> mGenericArgs;
  2751. BfSizedArray<ASTREF(BfAstNode*)> mCommas;
  2752. ASTREF(BfTokenNode*) mCloseChevron;
  2753. }; BF_AST_DECL(BfGenericArgumentsNode, BfAstNode);
  2754. class BfTokenPairNode : public BfAstNode
  2755. {
  2756. public:
  2757. BF_AST_TYPE(BfTokenPairNode, BfAstNode);
  2758. BfTokenNode* mLeft;
  2759. BfTokenNode* mRight;
  2760. }; BF_AST_DECL(BfTokenPairNode, BfAstNode);
  2761. class BfGenericOperatorConstraint : public BfAstNode
  2762. {
  2763. public:
  2764. BF_AST_TYPE(BfGenericOperatorConstraint, BfAstNode);
  2765. BfTokenNode* mOperatorToken;
  2766. BfTypeReference* mLeftType;
  2767. BfTokenNode* mOpToken;
  2768. BfTypeReference* mRightType;
  2769. }; BF_AST_DECL(BfGenericOperatorConstraint, BfAstNode);
  2770. class BfGenericConstraint : public BfAstNode
  2771. {
  2772. public:
  2773. BF_AST_TYPE(BfGenericConstraint, BfAstNode);
  2774. BfTokenNode* mWhereToken;
  2775. BfTypeReference* mTypeRef;
  2776. BfTokenNode* mColonToken;
  2777. BfSizedArray<BfAstNode*> mConstraintTypes;
  2778. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  2779. }; BF_AST_DECL(BfGenericConstraint, BfAstNode);
  2780. class BfGenericConstraintExpression : public BfAstNode
  2781. {
  2782. public:
  2783. BF_AST_TYPE(BfGenericConstraintExpression, BfAstNode);
  2784. BfTokenNode* mWhereToken;
  2785. BfExpression* mExpression;
  2786. }; BF_AST_DECL(BfGenericConstraintExpression, BfAstNode);
  2787. class BfGenericConstraintsDeclaration : public BfAstNode
  2788. {
  2789. public:
  2790. BF_AST_TYPE(BfGenericConstraintsDeclaration, BfAstNode);
  2791. BfSizedArray<BfAstNode*> mGenericConstraints;
  2792. bool mHasExpressions;
  2793. }; BF_AST_DECL(BfGenericConstraintsDeclaration, BfAstNode);
  2794. class BfMethodDeclaration : public BfMemberDeclaration
  2795. {
  2796. public:
  2797. BF_AST_TYPE(BfMethodDeclaration, BfMemberDeclaration);
  2798. BfCommentNode* mDocumentation;
  2799. BfTokenNode* mExternSpecifier;
  2800. BfTokenNode* mVirtualSpecifier; // either 'virtual', 'override', or 'abstract'
  2801. BfTokenNode* mNewSpecifier;
  2802. BfTokenNode* mMixinSpecifier;
  2803. BfTokenNode* mPartialSpecifier;
  2804. BfTokenNode* mMutSpecifier;
  2805. BfTypeReference* mReturnType;
  2806. BfTypeReference* mExplicitInterface;
  2807. BfTokenNode* mExplicitInterfaceDotToken;
  2808. BfIdentifierNode* mNameNode;
  2809. BfTokenNode* mOpenParen;
  2810. BfTokenNode* mThisToken;
  2811. BfSizedArray<BfParameterDeclaration*> mParams;
  2812. BfSizedArray<BfTokenNode*> mCommas;
  2813. BfTokenNode* mCloseParen;
  2814. BfGenericParamsDeclaration* mGenericParams;
  2815. BfGenericConstraintsDeclaration* mGenericConstraintsDeclaration;
  2816. BfAstNode* mEndSemicolon;
  2817. BfTokenNode* mFatArrowToken;
  2818. BfAstNode* mBody; // Either expression or block
  2819. //BfMethodDef* mMethodDef;
  2820. bool mHadYield;
  2821. }; BF_AST_DECL(BfMethodDeclaration, BfMemberDeclaration);
  2822. class BfOperatorDeclaration : public BfMethodDeclaration
  2823. {
  2824. public:
  2825. BF_AST_TYPE(BfOperatorDeclaration, BfMethodDeclaration);
  2826. BfTokenNode* mExplicitToken; // Explicit or Implicit
  2827. BfTokenNode* mOperatorToken;
  2828. BfTokenNode* mOpTypeToken;
  2829. bool mIsConvOperator;
  2830. BfUnaryOp mUnaryOp;
  2831. BfBinaryOp mBinOp;
  2832. BfAssignmentOp mAssignOp;
  2833. }; BF_AST_DECL(BfOperatorDeclaration, BfMethodDeclaration);
  2834. class BfConstructorDeclaration : public BfMethodDeclaration
  2835. {
  2836. public:
  2837. BF_AST_TYPE(BfConstructorDeclaration, BfMethodDeclaration);
  2838. BfTokenNode* mThisToken;
  2839. BfTokenNode* mInitializerColonToken;
  2840. BfExpression* mInitializer;
  2841. }; BF_AST_DECL(BfConstructorDeclaration, BfMethodDeclaration);
  2842. class BfAutoConstructorDeclaration : public BfConstructorDeclaration
  2843. {
  2844. public:
  2845. BF_AST_TYPE(BfAutoConstructorDeclaration, BfConstructorDeclaration);
  2846. BfAstNode* mPrefix;
  2847. }; BF_AST_DECL(BfAutoConstructorDeclaration, BfConstructorDeclaration);
  2848. class BfDestructorDeclaration : public BfMethodDeclaration
  2849. {
  2850. public:
  2851. BF_AST_TYPE(BfDestructorDeclaration, BfMethodDeclaration);
  2852. BfTokenNode* mTildeToken;
  2853. BfTokenNode* mThisToken;
  2854. }; BF_AST_DECL(BfDestructorDeclaration, BfMethodDeclaration);
  2855. class BfFieldDtorDeclaration : public BfAstNode
  2856. {
  2857. public:
  2858. BF_AST_TYPE(BfFieldDtorDeclaration, BfAstNode);
  2859. BfTokenNode* mTildeToken;
  2860. BfAstNode* mBody;
  2861. BfFieldDtorDeclaration* mNextFieldDtor;
  2862. }; BF_AST_DECL(BfFieldDtorDeclaration, BfAstNode);
  2863. class BfUsingSpecifierNode : public BfAstNode
  2864. {
  2865. public:
  2866. BF_AST_TYPE(BfUsingSpecifierNode, BfAstNode);
  2867. BfAstNode* mProtection;
  2868. BfTokenNode* mUsingToken;
  2869. }; BF_AST_DECL(BfUsingSpecifierNode, BfAstNode);
  2870. class BfFieldDeclaration : public BfMemberDeclaration
  2871. {
  2872. public:
  2873. BF_AST_TYPE(BfFieldDeclaration, BfMemberDeclaration);
  2874. BfCommentNode* mDocumentation;
  2875. BfTokenNode* mPrecedingComma;
  2876. BfAstNode* mConstSpecifier; // Could be 'const' or 'using'
  2877. BfTokenNode* mVolatileSpecifier;
  2878. BfTokenNode* mNewSpecifier;
  2879. BfTokenNode* mExternSpecifier; // Could be 'extern' or 'append'
  2880. BfTypeReference* mTypeRef;
  2881. BfIdentifierNode* mNameNode;
  2882. BfTokenNode* mEqualsNode;
  2883. BfExpression* mInitializer;
  2884. BfFieldDtorDeclaration* mFieldDtor;
  2885. BfFieldDef* mFieldDef;
  2886. }; BF_AST_DECL(BfFieldDeclaration, BfMemberDeclaration);
  2887. class BfEnumEntryDeclaration : public BfFieldDeclaration
  2888. {
  2889. public:
  2890. BF_AST_TYPE(BfEnumEntryDeclaration, BfFieldDeclaration);
  2891. }; BF_AST_DECL(BfEnumEntryDeclaration, BfFieldDeclaration);
  2892. class BfPropertyMethodDeclaration : public BfAstNode
  2893. {
  2894. public:
  2895. BF_AST_TYPE(BfPropertyMethodDeclaration, BfAstNode);
  2896. BfPropertyDeclaration* mPropertyDeclaration;
  2897. BfAttributeDirective* mAttributes;
  2898. BfAstNode* mProtectionSpecifier;
  2899. BfTokenNode* mSetRefSpecifier;
  2900. BfTokenNode* mMutSpecifier;
  2901. BfIdentifierNode* mNameNode;
  2902. BfTokenNode* mFatArrowToken;
  2903. BfAstNode* mBody;
  2904. BfAstNode* mEndSemicolon;
  2905. }; BF_AST_DECL(BfPropertyMethodDeclaration, BfAstNode);
  2906. class BfPropertyBodyExpression : public BfAstNode
  2907. {
  2908. public:
  2909. BF_AST_TYPE(BfPropertyBodyExpression, BfAstNode);
  2910. BfTokenNode* mMutSpecifier;
  2911. BfTokenNode* mFatTokenArrow;
  2912. }; BF_AST_DECL(BfPropertyBodyExpression, BfAstNode);
  2913. class BfPropertyDeclaration : public BfFieldDeclaration
  2914. {
  2915. public:
  2916. BF_AST_TYPE(BfPropertyDeclaration, BfFieldDeclaration);
  2917. BfTokenNode* mVirtualSpecifier; // either 'virtual', 'override', or 'abstract'
  2918. BfTypeReference* mExplicitInterface;
  2919. BfTokenNode* mExplicitInterfaceDotToken;
  2920. BfAstNode* mDefinitionBlock;
  2921. BfSizedArray<BfPropertyMethodDeclaration*> mMethods;
  2922. BfPropertyMethodDeclaration* GetMethod(const StringImpl& name);
  2923. }; BF_AST_DECL(BfPropertyDeclaration, BfFieldDeclaration);
  2924. class BfIndexerDeclaration : public BfPropertyDeclaration
  2925. {
  2926. public:
  2927. BF_AST_TYPE(BfIndexerDeclaration, BfPropertyDeclaration);
  2928. BfTokenNode* mThisToken;
  2929. BfTokenNode* mOpenBracket;
  2930. BfSizedArray<ASTREF(BfParameterDeclaration*)> mParams;
  2931. BfSizedArray<ASTREF(BfTokenNode*)> mCommas;
  2932. BfTokenNode* mCloseBracket;
  2933. }; BF_AST_DECL(BfIndexerDeclaration, BfPropertyDeclaration);
  2934. class BfBreakStatement : public BfStatement
  2935. {
  2936. public:
  2937. BF_AST_TYPE(BfBreakStatement, BfStatement);
  2938. BfTokenNode* mBreakNode;
  2939. BfAstNode* mLabel;
  2940. }; BF_AST_DECL(BfBreakStatement, BfStatement);
  2941. class BfTryStatement : public BfCompoundStatement
  2942. {
  2943. public:
  2944. BF_AST_TYPE(BfTryStatement, BfCompoundStatement);
  2945. BfTokenNode* mTryToken;
  2946. BfAstNode* mStatement;
  2947. }; BF_AST_DECL(BfTryStatement, BfCompoundStatement);
  2948. class BfCatchStatement : public BfCompoundStatement
  2949. {
  2950. public:
  2951. BF_AST_TYPE(BfCatchStatement, BfCompoundStatement);
  2952. BfTokenNode* mCatchToken;
  2953. BfAstNode* mStatement;
  2954. }; BF_AST_DECL(BfCatchStatement, BfCompoundStatement);
  2955. class BfFinallyStatement : public BfCompoundStatement
  2956. {
  2957. public:
  2958. BF_AST_TYPE(BfFinallyStatement, BfCompoundStatement);
  2959. BfTokenNode* mFinallyToken;
  2960. BfAstNode* mStatement;
  2961. }; BF_AST_DECL(BfFinallyStatement, BfCompoundStatement);
  2962. class BfCheckedStatement : public BfCompoundStatement
  2963. {
  2964. public:
  2965. BF_AST_TYPE(BfCheckedStatement, BfCompoundStatement);
  2966. BfTokenNode* mCheckedToken;
  2967. BfAstNode* mStatement;
  2968. }; BF_AST_DECL(BfCheckedStatement, BfCompoundStatement);
  2969. class BfUncheckedStatement : public BfCompoundStatement
  2970. {
  2971. public:
  2972. BF_AST_TYPE(BfUncheckedStatement, BfCompoundStatement);
  2973. BfTokenNode* mUncheckedToken;
  2974. BfAstNode* mStatement;
  2975. }; BF_AST_DECL(BfUncheckedStatement, BfCompoundStatement);
  2976. class BfContinueStatement : public BfStatement
  2977. {
  2978. public:
  2979. BF_AST_TYPE(BfContinueStatement, BfStatement);
  2980. BfTokenNode* mContinueNode;
  2981. BfAstNode* mLabel;
  2982. }; BF_AST_DECL(BfContinueStatement, BfStatement);
  2983. class BfFallthroughStatement : public BfStatement
  2984. {
  2985. public:
  2986. BF_AST_TYPE(BfFallthroughStatement, BfStatement);
  2987. BfTokenNode* mFallthroughToken;
  2988. BfAstNode* mLabel;
  2989. }; BF_AST_DECL(BfFallthroughStatement, BfStatement);
  2990. class BfForEachStatement : public BfLabelableStatement
  2991. {
  2992. public:
  2993. BF_AST_TYPE(BfForEachStatement, BfLabelableStatement);
  2994. BfTokenNode* mForToken;
  2995. BfTokenNode* mOpenParen;
  2996. BfTokenNode* mReadOnlyToken;
  2997. BfTypeReference* mVariableTypeRef;
  2998. BfAstNode* mVariableName; // Either BfIdentifierNode or BfTupleExpression
  2999. BfTokenNode* mInToken;
  3000. BfExpression* mCollectionExpression;
  3001. BfTokenNode* mCloseParen;
  3002. BfAstNode* mEmbeddedStatement;
  3003. }; BF_AST_DECL(BfForEachStatement, BfLabelableStatement);
  3004. class BfForStatement : public BfLabelableStatement
  3005. {
  3006. public:
  3007. BF_AST_TYPE(BfForStatement, BfLabelableStatement);
  3008. BfTokenNode* mForToken;
  3009. BfTokenNode* mOpenParen;
  3010. BfSizedArray<ASTREF(BfAstNode*)> mInitializers;
  3011. BfSizedArray<ASTREF(BfTokenNode*)> mInitializerCommas;
  3012. BfTokenNode* mInitializerSemicolon;
  3013. BfExpression* mCondition;
  3014. BfTokenNode* mConditionSemicolon;
  3015. BfSizedArray<ASTREF(BfAstNode*)> mIterators;
  3016. BfSizedArray<ASTREF(BfTokenNode*)> mIteratorCommas;
  3017. BfTokenNode* mCloseParen;
  3018. BfAstNode* mEmbeddedStatement;
  3019. }; BF_AST_DECL(BfForStatement, BfLabelableStatement);
  3020. class BfUsingStatement : public BfCompoundStatement
  3021. {
  3022. public:
  3023. BF_AST_TYPE(BfUsingStatement, BfCompoundStatement);
  3024. BfTokenNode* mUsingToken;
  3025. BfTokenNode* mOpenParen;
  3026. BfVariableDeclaration* mVariableDeclaration;
  3027. BfTokenNode* mCloseParen;
  3028. BfAstNode* mEmbeddedStatement;
  3029. }; BF_AST_DECL(BfUsingStatement, BfCompoundStatement);
  3030. class BfDoStatement : public BfLabelableStatement
  3031. {
  3032. public:
  3033. BF_AST_TYPE(BfDoStatement, BfLabelableStatement);
  3034. BfTokenNode* mDoToken;
  3035. BfAstNode* mEmbeddedStatement;
  3036. }; BF_AST_DECL(BfDoStatement, BfLabelableStatement);
  3037. class BfRepeatStatement : public BfLabelableStatement
  3038. {
  3039. public:
  3040. BF_AST_TYPE(BfRepeatStatement, BfLabelableStatement);
  3041. BfTokenNode* mRepeatToken;
  3042. BfAstNode* mEmbeddedStatement;
  3043. BfTokenNode* mWhileToken;
  3044. BfTokenNode* mOpenParen;
  3045. BfExpression* mCondition;
  3046. BfTokenNode* mCloseParen;
  3047. }; BF_AST_DECL(BfRepeatStatement, BfLabelableStatement);
  3048. class BfWhileStatement : public BfLabelableStatement
  3049. {
  3050. public:
  3051. BF_AST_TYPE(BfWhileStatement, BfLabelableStatement);
  3052. BfTokenNode* mWhileToken;
  3053. BfTokenNode* mOpenParen;
  3054. BfExpression* mCondition;
  3055. BfTokenNode* mCloseParen;
  3056. BfAstNode* mEmbeddedStatement;
  3057. }; BF_AST_DECL(BfWhileStatement, BfLabelableStatement);
  3058. class BfReturnStatement : public BfStatement
  3059. {
  3060. public:
  3061. BF_AST_TYPE(BfReturnStatement, BfStatement);
  3062. BfTokenNode* mReturnToken;
  3063. BfExpression* mExpression;
  3064. }; BF_AST_DECL(BfReturnStatement, BfStatement);
  3065. class BfYieldStatement : public BfStatement
  3066. {
  3067. public:
  3068. BF_AST_TYPE(BfYieldStatement, BfStatement);
  3069. BfTokenNode* mReturnOrBreakToken;
  3070. BfExpression* mExpression;
  3071. }; BF_AST_DECL(BfYieldStatement, BfStatement);
  3072. class BfInlineAsmStatement : public BfCompoundStatement
  3073. {
  3074. public:
  3075. BF_AST_TYPE(BfInlineAsmStatement, BfCompoundStatement);
  3076. BfTokenNode* mOpenBrace;
  3077. BfTokenNode* mCloseBrace;
  3078. Array<BfInlineAsmInstruction*> mInstructions;
  3079. //TODO: Make a block here
  3080. }; BF_AST_DECL(BfInlineAsmStatement, BfCompoundStatement);
  3081. class BfInlineAsmInstruction : public BfAstNode
  3082. {
  3083. public:
  3084. class AsmArg
  3085. {
  3086. public:
  3087. enum EArgType
  3088. {
  3089. ARGTYPE_Immediate, // immediate integer; uses mInt only
  3090. ARGTYPE_FloatReg, // float point st register; mInt is st reg index
  3091. ARGTYPE_IntReg, // general integer register; mReg is register name
  3092. ARGTYPE_Memory, // memory access; arg mem flags indicate additive permutation, [baseReg + adjReg*scalar + immDisplacement]
  3093. };
  3094. enum EArgMemFlags
  3095. {
  3096. ARGMEMF_ImmediateDisp = (1 << 0), // uses immediate displacement constant
  3097. ARGMEMF_BaseReg = (1 << 1), // uses unscaled base register
  3098. ARGMEMF_AdjReg = (1 << 2), // uses scaled adjustment register and scalar value
  3099. };
  3100. EArgType mType;
  3101. unsigned long mMemFlags;
  3102. String mSegPrefix; // if non-empty, cs|ds|es|fs|gs|ss
  3103. String mSizePrefix; // if non-empty, size prefix for memory accesses (e.g. byte|word|dword), syntactically followed by "ptr" although that's omitted here
  3104. int mInt; // memory displacement, immediate integer, fp st register index, etc.
  3105. String mReg; // general register, or unscaled base register for memory accesses
  3106. String mAdjReg; // scaled adjustment register for memory accesses
  3107. int mAdjRegScalar; // adjustment scalar (e.g. 2, 4, or 8).
  3108. String mMemberSuffix; // if non-empty, struct member suffix following memory access, e.g. [ebx].mFoo
  3109. AsmArg();
  3110. String ToString();
  3111. };
  3112. class AsmInst
  3113. {
  3114. public:
  3115. String mLabel;
  3116. Array<String> mOpPrefixes;
  3117. String mOpCode;
  3118. Array<AsmArg> mArgs;
  3119. int mDebugLine;
  3120. AsmInst();
  3121. String ToString();
  3122. };
  3123. public:
  3124. BF_AST_TYPE(BfInlineAsmInstruction, BfAstNode);
  3125. AsmInst mAsmInst;
  3126. }; BF_AST_DECL(BfInlineAsmInstruction, BfAstNode);
  3127. const char* BfTokenToString(BfToken token);
  3128. bool BfTokenIsKeyword(BfToken token);
  3129. bool BfTokenIsTypeDecl(BfToken token);
  3130. BfBinaryOp BfAssignOpToBinaryOp(BfAssignmentOp assignmentOp);
  3131. BfBinaryOp BfGetOppositeBinaryOp(BfBinaryOp origOp);
  3132. BfBinaryOp BfGetFlippedBinaryOp(BfBinaryOp origOp);
  3133. bool BfBinOpEqualityCheck(BfBinaryOp binOp);
  3134. int BfGetBinaryOpPrecendence(BfBinaryOp binOp);
  3135. const char* BfGetOpName(BfBinaryOp binOp);
  3136. const char* BfGetOpName(BfUnaryOp unaryOp);
  3137. bool BfCanOverloadOperator(BfUnaryOp unaryOp);
  3138. BfBinaryOp BfTokenToBinaryOp(BfToken token);
  3139. BfUnaryOp BfTokenToUnaryOp(BfToken token);
  3140. BfAssignmentOp BfTokenToAssignmentOp(BfToken token);
  3141. bool BfIsCommentBlock(BfCommentKind commentKind);
  3142. NS_BF_END
  3143. template<>
  3144. struct BeefHash<Beefy::BfVariant>
  3145. {
  3146. size_t operator()(const Beefy::BfVariant& val) const
  3147. {
  3148. if (val.mTypeCode == Beefy::BfTypeCode_Struct)
  3149. {
  3150. Beefy::BfVariant::StructData* structData = (Beefy::BfVariant::StructData*)val.mPtr;
  3151. return HashBytes(structData->mData, structData->mSize);
  3152. }
  3153. return (size_t)val.mUInt64;
  3154. }
  3155. };
  3156. namespace std
  3157. {
  3158. template<>
  3159. struct hash<Beefy::BfAstNodeList>
  3160. {
  3161. size_t operator()(const Beefy::BfAstNodeList& val) const
  3162. {
  3163. if (val.mList.mSize == 0)
  3164. return 0;
  3165. if (val.mList.mSize == 0)
  3166. return (size_t)val.mList.mVals[0];
  3167. return HashBytes((uint8*)val.mList.mVals, sizeof(Beefy::BfAstNode*) * val.mList.mSize);
  3168. }
  3169. };
  3170. }