BfAst.h 81 KB

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