BfAst.h 88 KB

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