BfAst.h 77 KB

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