BfAst.cpp 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187
  1. #define BF_AST_DO_IMPL
  2. #include "BfAst.h"
  3. #include "BfParser.h"
  4. #include "BfSystem.h"
  5. USING_NS_BF;
  6. //////////////////////////////////////////////////////////////////////////
  7. BfStructuralVisitor::BfStructuralVisitor()
  8. {
  9. std::hash<std::string>();
  10. mCapturingChildRef = false;
  11. mCurChildRef = NULL;
  12. }
  13. void BfStructuralVisitor::VisitMembers(BfBlock* node)
  14. {
  15. for (auto& child : *node)
  16. {
  17. child->Accept(this);
  18. }
  19. }
  20. void BfStructuralVisitor::VisitChildNoRef(BfAstNode* node)
  21. {
  22. mCurChildRef = NULL;
  23. node->Accept(this);
  24. mCurChildRef = NULL;
  25. }
  26. void BfStructuralVisitor::DoVisitChild(BfAstNode*& node)
  27. {
  28. if (node == NULL)
  29. return;
  30. mCurChildRef = &node;
  31. node->Accept(this);
  32. mCurChildRef = NULL;
  33. }
  34. void BfStructuralVisitor::AssertValidChildAddr(BfAstNode** nodeRef)
  35. {
  36. //auto bfSource = (*nodeRef)->mSource;
  37. //BF_ASSERT(bfSource->mAlloc.ContainsPtr(nodeRef));
  38. }
  39. void BfStructuralVisitor::Visit(BfLabeledBlock* labeledBlock)
  40. {
  41. Visit(labeledBlock->ToBase());
  42. }
  43. void BfStructuralVisitor::Visit(BfErrorNode* bfErrorNode)
  44. {
  45. Visit(bfErrorNode->ToBase());
  46. }
  47. void BfStructuralVisitor::Visit(BfScopeNode* scopeNode)
  48. {
  49. Visit(scopeNode->ToBase());
  50. }
  51. void BfStructuralVisitor::Visit(BfNewNode* newNode)
  52. {
  53. Visit(newNode->ToBase());
  54. }
  55. void BfStructuralVisitor::Visit(BfTypedValueExpression* typedValueExpr)
  56. {
  57. Visit(typedValueExpr->ToBase());
  58. }
  59. void BfStructuralVisitor::Visit(BfCommentNode* commentNode)
  60. {
  61. Visit(commentNode->ToBase());
  62. }
  63. void BfStructuralVisitor::Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection)
  64. {
  65. Visit(preprocesorIgnoredSection->ToBase());
  66. }
  67. void BfStructuralVisitor::Visit(BfPreprocessorNode* preprocessorNode)
  68. {
  69. Visit(preprocessorNode->ToBase());
  70. }
  71. void BfStructuralVisitor::Visit(BfPreprocessorDefinedExpression* definedExpr)
  72. {
  73. Visit(definedExpr->ToBase());
  74. }
  75. void BfStructuralVisitor::Visit(BfAttributeDirective* attributeDirective)
  76. {
  77. Visit(attributeDirective->ToBase());
  78. }
  79. void BfStructuralVisitor::Visit(BfGenericParamsDeclaration* genericParams)
  80. {
  81. Visit(genericParams->ToBase());
  82. }
  83. void BfStructuralVisitor::Visit(BfGenericOperatorConstraint* genericConstraints)
  84. {
  85. Visit(genericConstraints->ToBase());
  86. }
  87. void BfStructuralVisitor::Visit(BfGenericConstraintsDeclaration* genericConstraints)
  88. {
  89. Visit(genericConstraints->ToBase());
  90. }
  91. void BfStructuralVisitor::Visit(BfGenericArgumentsNode* genericArgumentsNode)
  92. {
  93. Visit(genericArgumentsNode->ToBase());
  94. }
  95. void BfStructuralVisitor::Visit(BfCtorExplicitNode* ctorExplicitNode)
  96. {
  97. Visit(ctorExplicitNode->ToBase());
  98. }
  99. void BfStructuralVisitor::Visit(BfStatement* stmt)
  100. {
  101. Visit(stmt->ToBase());
  102. }
  103. void BfStructuralVisitor::Visit(BfAttributedStatement* attribStmt)
  104. {
  105. Visit(attribStmt->ToBase());
  106. }
  107. void BfStructuralVisitor::Visit(BfLabelableStatement* labelableStmt)
  108. {
  109. Visit(labelableStmt->ToBase());
  110. }
  111. void BfStructuralVisitor::Visit(BfExpression* expr)
  112. {
  113. Visit(expr->ToBase());
  114. }
  115. void BfStructuralVisitor::Visit(BfExpressionStatement* exprStmt)
  116. {
  117. Visit(exprStmt->ToBase());
  118. }
  119. void BfStructuralVisitor::Visit(BfNamedExpression* namedExpr)
  120. {
  121. Visit(namedExpr->ToBase());
  122. }
  123. void BfStructuralVisitor::Visit(BfAttributedExpression* attribExpr)
  124. {
  125. Visit(attribExpr->ToBase());
  126. }
  127. void BfStructuralVisitor::Visit(BfEmptyStatement* emptyStmt)
  128. {
  129. Visit(emptyStmt->ToBase());
  130. }
  131. void BfStructuralVisitor::Visit(BfTokenNode* tokenNode)
  132. {
  133. Visit(tokenNode->ToBase());
  134. }
  135. void BfStructuralVisitor::Visit(BfTokenPairNode* tokenPairNode)
  136. {
  137. Visit(tokenPairNode->ToBase());
  138. }
  139. void BfStructuralVisitor::Visit(BfUsingSpecifierNode* usingSpecifier)
  140. {
  141. Visit(usingSpecifier->ToBase());
  142. }
  143. void BfStructuralVisitor::Visit(BfLiteralExpression* literalExpr)
  144. {
  145. Visit(literalExpr->ToBase());
  146. }
  147. void BfStructuralVisitor::Visit(BfStringInterpolationExpression* stringInterpolationExpression)
  148. {
  149. Visit(stringInterpolationExpression->ToBase());
  150. }
  151. void BfStructuralVisitor::Visit(BfIdentifierNode* identifierNode)
  152. {
  153. Visit(identifierNode->ToBase());
  154. }
  155. void BfStructuralVisitor::Visit(BfAttributedIdentifierNode* attrIdentifierNode)
  156. {
  157. Visit(attrIdentifierNode->ToBase());
  158. }
  159. void BfStructuralVisitor::Visit(BfQualifiedNameNode* nameNode)
  160. {
  161. Visit(nameNode->ToBase());
  162. }
  163. void BfStructuralVisitor::Visit(BfThisExpression* thisExpr)
  164. {
  165. Visit(thisExpr->ToBase());
  166. }
  167. void BfStructuralVisitor::Visit(BfBaseExpression* baseExpr)
  168. {
  169. Visit(baseExpr->ToBase());
  170. }
  171. void BfStructuralVisitor::Visit(BfMixinExpression* mixinExpr)
  172. {
  173. Visit(mixinExpr->ToBase());
  174. }
  175. void BfStructuralVisitor::Visit(BfSizedArrayCreateExpression* createExpr)
  176. {
  177. Visit(createExpr->ToBase());
  178. }
  179. void BfStructuralVisitor::Visit(BfInitializerExpression* initExpr)
  180. {
  181. Visit(initExpr->ToBase());
  182. }
  183. void BfStructuralVisitor::Visit(BfCollectionInitializerExpression* collectionInitExpr)
  184. {
  185. Visit(collectionInitExpr->ToBase());
  186. }
  187. void BfStructuralVisitor::Visit(BfTypeReference* typeRef)
  188. {
  189. Visit(typeRef->ToBase());
  190. }
  191. void BfStructuralVisitor::Visit(BfInlineTypeReference* typeRef)
  192. {
  193. Visit(typeRef->ToBase());
  194. }
  195. void BfStructuralVisitor::Visit(BfNamedTypeReference* typeRef)
  196. {
  197. Visit(typeRef->ToBase());
  198. }
  199. void BfStructuralVisitor::Visit(BfQualifiedTypeReference* qualifiedTypeRef)
  200. {
  201. Visit(qualifiedTypeRef->ToBase());
  202. }
  203. void BfStructuralVisitor::Visit(BfDotTypeReference* typeRef)
  204. {
  205. Visit(typeRef->ToBase());
  206. }
  207. void BfStructuralVisitor::Visit(BfVarTypeReference* typeRef)
  208. {
  209. Visit(typeRef->ToBase());
  210. }
  211. void BfStructuralVisitor::Visit(BfVarRefTypeReference* typeRef)
  212. {
  213. Visit(typeRef->ToBase());
  214. }
  215. void BfStructuralVisitor::Visit(BfLetTypeReference* typeRef)
  216. {
  217. Visit(typeRef->ToBase());
  218. }
  219. void BfStructuralVisitor::Visit(BfConstTypeRef* typeRef)
  220. {
  221. Visit(typeRef->ToBase());
  222. }
  223. void BfStructuralVisitor::Visit(BfConstExprTypeRef* typeRef)
  224. {
  225. Visit(typeRef->ToBase());
  226. }
  227. void BfStructuralVisitor::Visit(BfRefTypeRef* typeRef)
  228. {
  229. Visit(typeRef->ToBase());
  230. }
  231. void BfStructuralVisitor::Visit(BfModifiedTypeRef* typeRef)
  232. {
  233. Visit(typeRef->ToBase());
  234. }
  235. void BfStructuralVisitor::Visit(BfArrayTypeRef* typeRef)
  236. {
  237. Visit(typeRef->ToBase());
  238. }
  239. void BfStructuralVisitor::Visit(BfGenericInstanceTypeRef* typeRef)
  240. {
  241. Visit(typeRef->ToBase());
  242. }
  243. void BfStructuralVisitor::Visit(BfTupleTypeRef* typeRef)
  244. {
  245. Visit(typeRef->ToBase());
  246. }
  247. void BfStructuralVisitor::Visit(BfTagTypeRef* typeRef)
  248. {
  249. Visit(typeRef->ToBase());
  250. }
  251. void BfStructuralVisitor::Visit(BfDelegateTypeRef* typeRef)
  252. {
  253. Visit(typeRef->ToBase());
  254. }
  255. void BfStructuralVisitor::Visit(BfExprModTypeRef* declTypeRef)
  256. {
  257. Visit(declTypeRef->ToBase());
  258. }
  259. void BfStructuralVisitor::Visit(BfPointerTypeRef* typeRef)
  260. {
  261. Visit(typeRef->ToBase());
  262. }
  263. void BfStructuralVisitor::Visit(BfNullableTypeRef* typeRef)
  264. {
  265. Visit(typeRef->ToBase());
  266. }
  267. void BfStructuralVisitor::Visit(BfVariableDeclaration* varDecl)
  268. {
  269. Visit(varDecl->ToBase());
  270. }
  271. void BfStructuralVisitor::Visit(BfLocalMethodDeclaration* methodDecl)
  272. {
  273. Visit(methodDecl->ToBase());
  274. }
  275. void BfStructuralVisitor::Visit(BfParameterDeclaration* paramDecl)
  276. {
  277. Visit(paramDecl->ToBase());
  278. }
  279. void BfStructuralVisitor::Visit(BfTypeAttrExpression* typeAttrExpr)
  280. {
  281. Visit(typeAttrExpr->ToBase());
  282. }
  283. void BfStructuralVisitor::Visit(BfTypeOfExpression* typeOfExpr)
  284. {
  285. Visit(typeOfExpr->ToBase());
  286. }
  287. void BfStructuralVisitor::Visit(BfSizeOfExpression* sizeOfExpr)
  288. {
  289. Visit(sizeOfExpr->ToBase());
  290. }
  291. void BfStructuralVisitor::Visit(BfAlignOfExpression* alignOfExpr)
  292. {
  293. Visit(alignOfExpr->ToBase());
  294. }
  295. void BfStructuralVisitor::Visit(BfStrideOfExpression* strideOfExpr)
  296. {
  297. Visit(strideOfExpr->ToBase());
  298. }
  299. void BfStructuralVisitor::Visit(BfOffsetOfExpression* offsetOfExpr)
  300. {
  301. Visit(offsetOfExpr->ToBase());
  302. }
  303. void BfStructuralVisitor::Visit(BfNameOfExpression* nameOfExpr)
  304. {
  305. Visit(nameOfExpr->ToBase());
  306. }
  307. void BfStructuralVisitor::Visit(BfIsConstExpression* isConstExpr)
  308. {
  309. Visit(isConstExpr->ToBase());
  310. }
  311. void BfStructuralVisitor::Visit(BfDefaultExpression* defaultExpr)
  312. {
  313. Visit(defaultExpr->ToBase());
  314. }
  315. void BfStructuralVisitor::Visit(BfUninitializedExpression* uninitializedExpr)
  316. {
  317. Visit(uninitializedExpr->ToBase());
  318. }
  319. void BfStructuralVisitor::Visit(BfCheckTypeExpression* checkTypeExpr)
  320. {
  321. Visit(checkTypeExpr->ToBase());
  322. }
  323. void BfStructuralVisitor::Visit(BfDynamicCastExpression* dynCastExpr)
  324. {
  325. Visit(dynCastExpr->ToBase());
  326. }
  327. void BfStructuralVisitor::Visit(BfCastExpression* castExpr)
  328. {
  329. Visit(castExpr->ToBase());
  330. }
  331. void BfStructuralVisitor::Visit(BfDelegateBindExpression* bindExpr)
  332. {
  333. Visit(bindExpr->ToBase());
  334. }
  335. void BfStructuralVisitor::Visit(BfLambdaBindExpression* lambdaBindExpr)
  336. {
  337. Visit(lambdaBindExpr->ToBase());
  338. }
  339. void BfStructuralVisitor::Visit(BfObjectCreateExpression* newExpr)
  340. {
  341. Visit(newExpr->ToBase());
  342. }
  343. void BfStructuralVisitor::Visit(BfBoxExpression* boxExpr)
  344. {
  345. Visit(boxExpr->ToBase());
  346. }
  347. void BfStructuralVisitor::Visit(BfThrowStatement* throwStmt)
  348. {
  349. Visit(throwStmt->ToBase());
  350. }
  351. void BfStructuralVisitor::Visit(BfDeleteStatement* deleteStmt)
  352. {
  353. Visit(deleteStmt->ToBase());
  354. }
  355. void BfStructuralVisitor::Visit(BfScopedInvocationTarget* scopedTarget)
  356. {
  357. Visit(scopedTarget->ToBase());
  358. }
  359. void BfStructuralVisitor::Visit(BfInvocationExpression* invocationExpr)
  360. {
  361. Visit(invocationExpr->ToBase());
  362. }
  363. void BfStructuralVisitor::Visit(BfEnumCaseBindExpression* caseBindExpr)
  364. {
  365. Visit(caseBindExpr->ToBase());
  366. }
  367. void BfStructuralVisitor::Visit(BfCaseExpression* caseExpr)
  368. {
  369. Visit(caseExpr->ToBase());
  370. }
  371. void BfStructuralVisitor::Visit(BfSwitchCase* switchCase)
  372. {
  373. Visit(switchCase->ToBase());
  374. }
  375. void BfStructuralVisitor::Visit(BfWhenExpression* whenExpr)
  376. {
  377. Visit(whenExpr->ToBase());
  378. }
  379. void BfStructuralVisitor::Visit(BfSwitchStatement* switchStmt)
  380. {
  381. Visit(switchStmt->ToBase());
  382. }
  383. void BfStructuralVisitor::Visit(BfTryStatement* tryStmt)
  384. {
  385. Visit(tryStmt->ToBase());
  386. }
  387. void BfStructuralVisitor::Visit(BfCatchStatement* catchStmt)
  388. {
  389. Visit(catchStmt->ToBase());
  390. }
  391. void BfStructuralVisitor::Visit(BfFinallyStatement* finallyStmt)
  392. {
  393. Visit(finallyStmt->ToBase());
  394. }
  395. void BfStructuralVisitor::Visit(BfCheckedStatement* checkedStmt)
  396. {
  397. Visit(checkedStmt->ToBase());
  398. }
  399. void BfStructuralVisitor::Visit(BfUncheckedStatement* uncheckedStmt)
  400. {
  401. Visit(uncheckedStmt->ToBase());
  402. }
  403. void BfStructuralVisitor::Visit(BfIfStatement* ifStmt)
  404. {
  405. Visit(ifStmt->ToBase());
  406. }
  407. void BfStructuralVisitor::Visit(BfDeferStatement* deferStmt)
  408. {
  409. Visit(deferStmt->ToBase());
  410. }
  411. void BfStructuralVisitor::Visit(BfReturnStatement* returnStmt)
  412. {
  413. Visit(returnStmt->ToBase());
  414. }
  415. void BfStructuralVisitor::Visit(BfYieldStatement* yieldStmt)
  416. {
  417. Visit(yieldStmt->ToBase());
  418. }
  419. void BfStructuralVisitor::Visit(BfUsingStatement* whileStmt)
  420. {
  421. Visit(whileStmt->ToBase());
  422. }
  423. void BfStructuralVisitor::Visit(BfDoStatement* doStmt)
  424. {
  425. Visit(doStmt->ToBase());
  426. }
  427. void BfStructuralVisitor::Visit(BfRepeatStatement* repeatStmt)
  428. {
  429. Visit(repeatStmt->ToBase());
  430. }
  431. void BfStructuralVisitor::Visit(BfWhileStatement* whileStmt)
  432. {
  433. Visit(whileStmt->ToBase());
  434. }
  435. void BfStructuralVisitor::Visit(BfBreakStatement* breakStmt)
  436. {
  437. Visit(breakStmt->ToBase());
  438. }
  439. void BfStructuralVisitor::Visit(BfContinueStatement* continueStmt)
  440. {
  441. Visit(continueStmt->ToBase());
  442. }
  443. void BfStructuralVisitor::Visit(BfFallthroughStatement* fallthroughStmt)
  444. {
  445. Visit(fallthroughStmt->ToBase());
  446. }
  447. void BfStructuralVisitor::Visit(BfForStatement* forStmt)
  448. {
  449. Visit(forStmt->ToBase());
  450. }
  451. void BfStructuralVisitor::Visit(BfForEachStatement* forEachStmt)
  452. {
  453. Visit(forEachStmt->ToBase());
  454. }
  455. void BfStructuralVisitor::Visit(BfConditionalExpression* condExpr)
  456. {
  457. Visit(condExpr->ToBase());
  458. }
  459. void BfStructuralVisitor::Visit(BfAssignmentExpression* assignExpr)
  460. {
  461. Visit(assignExpr->ToBase());
  462. }
  463. void BfStructuralVisitor::Visit(BfParenthesizedExpression* parenExpr)
  464. {
  465. Visit(parenExpr->ToBase());
  466. }
  467. void BfStructuralVisitor::Visit(BfTupleExpression* tupleExpr)
  468. {
  469. Visit(tupleExpr->ToBase());
  470. }
  471. void BfStructuralVisitor::Visit(BfMemberReferenceExpression* memberRefExpr)
  472. {
  473. Visit(memberRefExpr->ToBase());
  474. }
  475. void BfStructuralVisitor::Visit(BfIndexerExpression* indexerExpr)
  476. {
  477. Visit(indexerExpr->ToBase());
  478. }
  479. void BfStructuralVisitor::Visit(BfUnaryOperatorExpression* binOpExpr)
  480. {
  481. Visit(binOpExpr->ToBase());
  482. }
  483. void BfStructuralVisitor::Visit(BfBinaryOperatorExpression* binOpExpr)
  484. {
  485. Visit(binOpExpr->ToBase());
  486. }
  487. void BfStructuralVisitor::Visit(BfConstructorDeclaration* ctorDeclaration)
  488. {
  489. Visit(ctorDeclaration->ToBase());
  490. }
  491. void BfStructuralVisitor::Visit(BfAutoConstructorDeclaration* ctorDeclaration)
  492. {
  493. Visit(ctorDeclaration->ToBase());
  494. }
  495. void BfStructuralVisitor::Visit(BfDestructorDeclaration* dtorDeclaration)
  496. {
  497. Visit(dtorDeclaration->ToBase());
  498. }
  499. void BfStructuralVisitor::Visit(BfMethodDeclaration* methodDeclaration)
  500. {
  501. Visit(methodDeclaration->ToBase());
  502. }
  503. void BfStructuralVisitor::Visit(BfOperatorDeclaration* operatorDeclaration)
  504. {
  505. Visit(operatorDeclaration->ToBase());
  506. }
  507. void BfStructuralVisitor::Visit(BfPropertyMethodDeclaration* propertyMethodDeclaration)
  508. {
  509. Visit(propertyMethodDeclaration->ToBase());
  510. }
  511. void BfStructuralVisitor::Visit(BfPropertyBodyExpression* propertyBodyExpression)
  512. {
  513. Visit(propertyBodyExpression->ToBase());
  514. }
  515. void BfStructuralVisitor::Visit(BfPropertyDeclaration* propertyDeclaration)
  516. {
  517. Visit(propertyDeclaration->ToBase());
  518. }
  519. void BfStructuralVisitor::Visit(BfIndexerDeclaration* indexerDeclaration)
  520. {
  521. Visit(indexerDeclaration->ToBase());
  522. }
  523. void BfStructuralVisitor::Visit(BfFieldDeclaration* fieldDeclaration)
  524. {
  525. Visit(fieldDeclaration->ToBase());
  526. }
  527. void BfStructuralVisitor::Visit(BfEnumCaseDeclaration* enumCaseDeclaration)
  528. {
  529. Visit(enumCaseDeclaration->ToBase());
  530. }
  531. void BfStructuralVisitor::Visit(BfFieldDtorDeclaration* fieldDtorDeclaration)
  532. {
  533. Visit(fieldDtorDeclaration->ToBase());
  534. }
  535. void BfStructuralVisitor::Visit(BfTypeDeclaration* typeDeclaration)
  536. {
  537. Visit(typeDeclaration->ToBase());
  538. }
  539. void BfStructuralVisitor::Visit(BfTypeAliasDeclaration* typeDeclaration)
  540. {
  541. Visit(typeDeclaration->ToBase());
  542. }
  543. void BfStructuralVisitor::Visit(BfUsingDirective* usingDirective)
  544. {
  545. Visit(usingDirective->ToBase());
  546. }
  547. void BfStructuralVisitor::Visit(BfUsingModDirective * usingDirective)
  548. {
  549. Visit(usingDirective->ToBase());
  550. }
  551. void BfStructuralVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
  552. {
  553. Visit(namespaceDeclaration->ToBase());
  554. }
  555. void BfStructuralVisitor::Visit(BfBlock* block)
  556. {
  557. Visit(block->ToBase());
  558. }
  559. void BfStructuralVisitor::Visit(BfUnscopedBlock* block)
  560. {
  561. Visit(block->ToBase());
  562. }
  563. void BfStructuralVisitor::Visit(BfBlockExtension* block)
  564. {
  565. BF_ASSERT("Shouldn't see this block, BfBlock::Iterator not being used?");
  566. }
  567. void BfStructuralVisitor::Visit(BfRootNode* rootNode)
  568. {
  569. Visit(rootNode->ToBase());
  570. }
  571. void BfStructuralVisitor::Visit(BfInlineAsmStatement* asmStmt)
  572. {
  573. Visit(asmStmt->ToBase());
  574. }
  575. void BfStructuralVisitor::Visit(BfInlineAsmInstruction* asmInst)
  576. {
  577. Visit(asmInst->ToBase());
  578. }
  579. //////////////////////////////////////////////////////////////////////////
  580. static Array<BfAstTypeInfo*> gTypes;
  581. static Array<BfAstAcceptFunc> gAcceptFuncs;
  582. static int sTypeCount;
  583. BfAstTypeInfo::BfAstTypeInfo(const char* name, BfAstTypeInfo* baseType, BfAstAcceptFunc acceptFunc)
  584. {
  585. mName = name;
  586. mBaseType = baseType;
  587. mAcceptFunc = acceptFunc;
  588. if (mBaseType != NULL)
  589. {
  590. mBaseType->mDerivedTypes.Add(this);
  591. }
  592. sTypeCount++;
  593. #ifdef _DEBUG
  594. auto checkBase = mBaseType;
  595. while (checkBase != NULL)
  596. {
  597. if (checkBase == &BfAstNode::sTypeInfo)
  598. break;
  599. checkBase = checkBase->mBaseType;
  600. }
  601. #endif
  602. }
  603. static void AddTypeInfo(BfAstTypeInfo* typeInfo)
  604. {
  605. BF_ASSERT(typeInfo->mTypeId == 0);
  606. typeInfo->mTypeId = (uint8)gTypes.size();
  607. gTypes.Add(typeInfo);
  608. gAcceptFuncs.Add(typeInfo->mAcceptFunc);
  609. for (auto derivedType : typeInfo->mDerivedTypes)
  610. AddTypeInfo(derivedType);
  611. typeInfo->mFullDerivedCount = (uint8)(gTypes.size() - typeInfo->mTypeId - 1);
  612. }
  613. void BfAstTypeInfo::Init()
  614. {
  615. if (!gTypes.IsEmpty())
  616. return;
  617. gTypes.Add(NULL);
  618. gAcceptFuncs.Add(NULL);
  619. AddTypeInfo(&BfAstNode::sTypeInfo);
  620. }
  621. BfIdentifierNode* Beefy::BfIdentifierCast(BfAstNode* node)
  622. {
  623. if (node == NULL)
  624. return NULL;
  625. if (node->GetTypeId() == BfAttributedIdentifierNode::sTypeInfo.mTypeId)
  626. return ((BfAttributedIdentifierNode*)node)->mIdentifier;
  627. bool canCast = (uint)node->GetTypeId() - (uint)BfIdentifierNode::sTypeInfo.mTypeId <= (uint)BfIdentifierNode::sTypeInfo.mFullDerivedCount;
  628. return canCast ? (BfIdentifierNode*)node : NULL;
  629. }
  630. BfAstNode* Beefy::BfNodeToNonTemporary(BfAstNode* node)
  631. {
  632. if (node == NULL)
  633. return NULL;
  634. if (node->GetTypeId() == BfNamedTypeReference::sTypeInfo.mTypeId)
  635. {
  636. auto namedTypeRef = (BfNamedTypeReference*)node;
  637. if (namedTypeRef->IsTemporary())
  638. return BfNodeToNonTemporary(namedTypeRef->mNameNode);
  639. return namedTypeRef;
  640. }
  641. if (!node->IsTemporary())
  642. return node;
  643. return NULL;
  644. }
  645. //////////////////////////////////////////////////////////////////////////
  646. bool BfAstNode::IsMissingSemicolon()
  647. {
  648. if (auto deferStmt = BfNodeDynCast<BfDeferStatement>(this))
  649. {
  650. if (BfNodeIsExact<BfBlock>(deferStmt->mTargetNode))
  651. return false;
  652. }
  653. if (auto stmt = BfNodeDynCast<BfCompoundStatement>(this))
  654. {
  655. if (auto repeatStmt = BfNodeDynCast<BfRepeatStatement>(this))
  656. {
  657. if (repeatStmt->mWhileToken == NULL)
  658. return false;
  659. }
  660. else
  661. return false;
  662. }
  663. if (auto attribExpr = BfNodeDynCastExact<BfAttributedStatement>(this))
  664. return (attribExpr->mStatement == NULL) || (attribExpr->mStatement->IsMissingSemicolon());
  665. if (auto stmt = BfNodeDynCast<BfStatement>(this))
  666. return stmt->mTrailingSemicolon == NULL;
  667. return false;
  668. }
  669. bool BfAstNode::IsExpression()
  670. {
  671. if (auto deferStmt = BfNodeDynCast<BfDeferStatement>(this))
  672. {
  673. if (BfNodeIsExact<BfBlock>(deferStmt->mTargetNode))
  674. return false;
  675. }
  676. if (auto block = BfNodeDynCast<BfBlock>(this))
  677. {
  678. if (block->mChildArr.mSize == 0)
  679. return false;
  680. return block->mChildArr.GetLast()->IsExpression();
  681. }
  682. return IsA<BfExpression>();
  683. }
  684. bool BfAstNode::WantsWarning(int warningNumber)
  685. {
  686. auto parserData = GetParserData();
  687. if (parserData == NULL)
  688. return true;
  689. int srcStart = GetSrcStart();
  690. return (!parserData->IsUnwarnedAt(this)) && (parserData->IsWarningEnabledAtSrcIndex(warningNumber, GetSrcStart()));
  691. }
  692. bool BfAstNode::LocationEquals(BfAstNode* otherNode)
  693. {
  694. return (GetSourceData() == otherNode->GetSourceData()) &&
  695. (GetSrcStart() == otherNode->GetSrcStart()) &&
  696. (GetSrcEnd() == otherNode->GetSrcEnd());
  697. }
  698. bool BfAstNode::LocationEndEquals(BfAstNode* otherNode)
  699. {
  700. return (GetSourceData() == otherNode->GetSourceData()) &&
  701. (GetSrcEnd() == otherNode->GetSrcEnd());
  702. }
  703. String BfAstNode::LocationToString()
  704. {
  705. auto parserData = GetParserData();
  706. if (parserData == NULL)
  707. return String();
  708. String loc;
  709. int line = -1;
  710. int lineChar = -1;
  711. parserData->GetLineCharAtIdx(mSrcStart, line, lineChar);
  712. if (line != -1)
  713. loc += StrFormat("at line %d:%d", line + 1, lineChar + 1);
  714. loc += " in ";
  715. loc += parserData->mFileName;
  716. return loc;
  717. }
  718. void BfAstNode::Add(BfAstNode* bfAstNode)
  719. {
  720. #ifdef BF_AST_HAS_PARENT_MEMBER
  721. BF_ASSERT(bfAstNode->mParent == NULL);
  722. bfAstNode->mParent = this;
  723. #endif
  724. if (!IsInitialized())
  725. {
  726. int childTriviaStart;
  727. int childSrcStart;
  728. int childSrcEnd;
  729. bfAstNode->GetSrcPositions(childTriviaStart, childSrcStart, childSrcEnd);
  730. Init(childTriviaStart, childSrcStart, childSrcEnd);
  731. return;
  732. }
  733. #ifdef BF_AST_COMPACT
  734. int childTriviaStart;
  735. int childSrcStart;
  736. int childSrcEnd;
  737. bfAstNode->GetSrcPositions(childTriviaStart, childSrcStart, childSrcEnd);
  738. int prevTriviaStart;
  739. int prevSrcStart;
  740. int prevSrcEnd;
  741. GetSrcPositions(prevTriviaStart, prevSrcStart, prevSrcEnd);
  742. if (childTriviaStart < prevTriviaStart)
  743. SetTriviaStart(childTriviaStart);
  744. if (childSrcStart < prevSrcStart)
  745. SetSrcStart(childSrcStart);
  746. if (childSrcEnd > prevSrcEnd)
  747. SetSrcEnd(childSrcEnd);
  748. #else
  749. BF_ASSERT(mSrcStart >= 0);
  750. BF_ASSERT(bfAstNode->mSrcStart >= 0);
  751. mSrcStart = BF_MIN(mSrcStart, bfAstNode->mSrcStart);
  752. mSrcEnd = BF_MAX(mSrcEnd, bfAstNode->mSrcEnd);
  753. #endif
  754. }
  755. #ifdef BF_AST_COMPACT
  756. BfAstInfo* BfAstNode::AllocAstInfo()
  757. {
  758. return GetSource()->mAlloc.Alloc<BfAstInfo>();
  759. }
  760. #endif
  761. void BfAstNode::RemoveSelf()
  762. {
  763. //mParent->mChildren.Remove(this);
  764. #ifdef BF_AST_HAS_PARENT_MEMBER
  765. mParent = NULL;
  766. #endif
  767. }
  768. void BfAstNode::DeleteSelf()
  769. {
  770. //if (mParent != NULL)
  771. //mParent->mChildren.Remove(this);
  772. delete this;
  773. }
  774. void BfAstNode::RemoveNextSibling()
  775. {
  776. //mNext->RemoveSelf();
  777. }
  778. void BfAstNode::DeleteNextSibling()
  779. {
  780. //mNext->DeleteSelf();
  781. }
  782. void BfAstNode::Init(BfParser* bfParser)
  783. {
  784. BF_ASSERT(GetSourceData() == bfParser->mSourceData);
  785. Init(bfParser->mTriviaStart, bfParser->mTokenStart, bfParser->mTokenEnd);
  786. }
  787. void BfAstNode::Accept(BfStructuralVisitor* bfVisitor)
  788. {
  789. (*gAcceptFuncs[GetTypeId()])(this, bfVisitor);
  790. }
  791. bool BfAstNode::IsTemporary()
  792. {
  793. #ifdef BF_AST_COMPACT
  794. return (mIsCompact) && (mCompact_SrcStart == 0) && (mCompact_SrcLen == 0);
  795. #else
  796. return (mSrcEnd == 0);
  797. #endif
  798. }
  799. int BfAstNode::GetStartCharId()
  800. {
  801. if (!IsTemporary())
  802. {
  803. auto bfParser = GetSourceData()->ToParserData();
  804. if (bfParser != NULL)
  805. return bfParser->GetCharIdAtIndex(GetSrcStart());
  806. }
  807. return GetSrcStart();
  808. }
  809. BfSourceData* BfAstNode::GetSourceData()
  810. {
  811. #ifdef BF_AST_ALLOCATOR_USE_PAGES
  812. //BF_ASSERT((intptr)this > 0x4200000000);
  813. BfAstPageHeader* pageHeader = (BfAstPageHeader*)((intptr)this & ~(BfAstAllocManager::PAGE_SIZE - 1));
  814. return pageHeader->mSourceData;
  815. #else
  816. return mSourceData;
  817. #endif
  818. }
  819. BfParserData* BfAstNode::GetParserData()
  820. {
  821. BfSourceData* sourceData = GetSourceData();
  822. if (sourceData == NULL)
  823. return NULL;
  824. return sourceData->ToParserData();
  825. }
  826. BfParser* BfAstNode::GetParser()
  827. {
  828. BfSourceData* sourceData = GetSourceData();
  829. if (sourceData == NULL)
  830. return NULL;
  831. return sourceData->ToParser();
  832. }
  833. bool BfAstNode::IsEmitted()
  834. {
  835. auto parser = GetParser();
  836. if (parser == NULL)
  837. return false;
  838. return parser->mIsEmitted;
  839. }
  840. bool BfAstNode::IsFromParser(BfParser* parser)
  841. {
  842. if (parser == NULL)
  843. return false;
  844. if (IsTemporary())
  845. return false;
  846. BfSourceData* sourceData = GetSourceData();
  847. if (sourceData == NULL)
  848. return false;
  849. return parser == sourceData->ToParser();
  850. }
  851. String BfAstNode::ToString()
  852. {
  853. int srcLen = GetSrcLength();
  854. if (srcLen <= 0)
  855. {
  856. if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
  857. return namedTypeRef->mNameNode->ToString();
  858. return "";
  859. }
  860. auto source = GetSourceData();
  861. String str(source->mSrc + GetSrcStart(), srcLen);
  862. return str;
  863. }
  864. StringView BfAstNode::ToStringView()
  865. {
  866. int srcLen = GetSrcLength();
  867. if (srcLen <= 0)
  868. {
  869. if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
  870. return namedTypeRef->mNameNode->ToStringView();
  871. return StringView();
  872. }
  873. auto source = GetSourceData();
  874. return StringView(source->mSrc + GetSrcStart(), srcLen);
  875. }
  876. void BfAstNode::ToString(StringImpl& str)
  877. {
  878. int srcLen = GetSrcLength();
  879. if (srcLen <= 0)
  880. {
  881. if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
  882. namedTypeRef->mNameNode->ToString(str);
  883. return;
  884. }
  885. auto source = GetSourceData();
  886. str.Append(source->mSrc + GetSrcStart(), srcLen);
  887. }
  888. bool BfAstNode::Equals(const StringImpl& str)
  889. {
  890. int len = mSrcEnd - mSrcStart;
  891. if (len != str.mLength)
  892. return false;
  893. auto source = GetSourceData();
  894. return strncmp(str.GetPtr(), source->mSrc + mSrcStart, len) == 0;
  895. }
  896. bool BfAstNode::Equals(const StringView& str)
  897. {
  898. int len = mSrcEnd - mSrcStart;
  899. if (len != str.mLength)
  900. return false;
  901. auto source = GetSourceData();
  902. return strncmp(str.mPtr, source->mSrc + mSrcStart, len) == 0;
  903. }
  904. bool BfAstNode::Equals(const char* str)
  905. {
  906. if (mSrcEnd == 0)
  907. return false;
  908. auto source = GetSourceData();
  909. const char* ptrLhs = source->mSrc + mSrcStart;
  910. const char* ptrLhsEnd = source->mSrc + mSrcEnd;
  911. const char* ptrRhs = str;
  912. while (true)
  913. {
  914. char cRhs = *(ptrRhs++);
  915. if (cRhs == 0)
  916. return ptrLhs == ptrLhsEnd;
  917. if (ptrLhs == ptrLhsEnd)
  918. return false;
  919. char cLhs = *(ptrLhs++);
  920. if (cLhs != cRhs)
  921. return false;
  922. }
  923. }
  924. //////////////////////////////////////////////////////////////////////////
  925. void BfBlock::Init(const SizedArrayImpl<BfAstNode*>& vec, BfAstAllocator* alloc)
  926. {
  927. #ifdef BF_USE_NEAR_NODE_REF
  928. int curIdx = 0;
  929. int elemsLeft = (int)vec.size();
  930. BfBlockExtension* curExt = NULL;
  931. while (elemsLeft > 0)
  932. {
  933. int bytesLeft = alloc->GetCurPageBytesLeft();
  934. int useElems = std::min(bytesLeft / (int)sizeof(ASTREF(BfAstNode*)), elemsLeft);
  935. BfBlockExtension* nextExt = NULL;
  936. BfSizedArray<ASTREF(BfAstNode*)>& childArrRef = (curExt != NULL) ? curExt->mChildArr : mChildArr;
  937. childArrRef.mVals = (ASTREF(BfAstNode*)*)alloc->AllocBytes(useElems * sizeof(ASTREF(BfAstNode*)), sizeof(ASTREF(BfAstNode*)));
  938. childArrRef.mSize = useElems;
  939. if (useElems < elemsLeft)
  940. {
  941. nextExt = alloc->Alloc<BfBlockExtension>();
  942. useElems--;
  943. }
  944. for (int i = 0; i < useElems; i++)
  945. childArrRef[i] = vec[curIdx++];
  946. if (nextExt != NULL)
  947. {
  948. childArrRef[useElems] = nextExt;
  949. curExt = nextExt;
  950. }
  951. elemsLeft -= useElems;
  952. }
  953. #else
  954. BfSizedArrayInitIndirect(mChildArr, vec, alloc);
  955. #endif
  956. }
  957. BfAstNode* BfBlock::GetFirst()
  958. {
  959. if (mChildArr.mSize == 0)
  960. return NULL;
  961. return mChildArr.mVals[0];
  962. }
  963. BfAstNode* BfBlock::GetLast()
  964. {
  965. if (mChildArr.mSize == 0)
  966. return NULL;
  967. auto backNode = mChildArr.mVals[mChildArr.mSize - 1];
  968. while (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
  969. backNode = blockExt->mChildArr.GetLast();
  970. return backNode;
  971. }
  972. int BfBlock::GetSize()
  973. {
  974. int size = mChildArr.mSize;
  975. if (mChildArr.mSize == 0)
  976. return size;
  977. BfAstNode* backNode = mChildArr.mVals[mChildArr.mSize - 1];
  978. while (true)
  979. {
  980. if (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
  981. {
  982. size--;
  983. size += blockExt->mChildArr.mSize;
  984. backNode = blockExt->mChildArr.mVals[blockExt->mChildArr.mSize - 1];
  985. }
  986. else
  987. {
  988. break;
  989. }
  990. }
  991. return size;
  992. }
  993. void BfBlock::SetSize(int wantSize)
  994. {
  995. int size = mChildArr.mSize;
  996. if (wantSize == size)
  997. return;
  998. if (wantSize < size)
  999. {
  1000. mChildArr.mSize = wantSize;
  1001. }
  1002. else
  1003. {
  1004. BfAstNode* backNode = mChildArr.mVals[mChildArr.mSize - 1];
  1005. while (true)
  1006. {
  1007. if (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
  1008. {
  1009. size--;
  1010. size += blockExt->mChildArr.mSize;
  1011. if (wantSize < size)
  1012. {
  1013. blockExt->mChildArr.mSize -= (size - wantSize);
  1014. break;
  1015. }
  1016. backNode = blockExt->mChildArr.mVals[blockExt->mChildArr.mSize - 1];
  1017. }
  1018. else
  1019. {
  1020. break;
  1021. }
  1022. }
  1023. }
  1024. BF_ASSERT(wantSize == GetSize());
  1025. }
  1026. //////////////////////////////////////////////////////////////////////////
  1027. bool BfTypeDeclaration::IsAnonymous()
  1028. {
  1029. return (mAnonymousName != NULL);
  1030. }
  1031. bool BfTypeDeclaration::IsAnonymousInitializerType()
  1032. {
  1033. return (mAnonymousName != NULL) && (mTypeNode == NULL);
  1034. }
  1035. //////////////////////////////////////////////////////////////////////////
  1036. bool BfTypeReference::IsNamedTypeReference()
  1037. {
  1038. return IsA<BfNamedTypeReference>() || IsA<BfDirectStrTypeReference>() || IsA<BfInlineTypeReference>();
  1039. }
  1040. bool BfTypeReference::IsTypeDefTypeReference()
  1041. {
  1042. return IsA<BfNamedTypeReference>() || IsA<BfDirectStrTypeReference>() || IsA<BfInlineTypeReference>() || IsA<BfDirectTypeDefReference>();
  1043. }
  1044. String BfTypeReference::ToCleanAttributeString()
  1045. {
  1046. // ToString might return something like "System.InlineAttribute", which we want to clean before we test for "Inline"
  1047. auto typeRefName = ToString();
  1048. if (typeRefName.EndsWith("Attribute"))
  1049. {
  1050. int attribNameStart = (int)typeRefName.LastIndexOf('.');
  1051. if (attribNameStart != -1)
  1052. typeRefName.Remove(0, attribNameStart + 1);
  1053. if (typeRefName.EndsWith("Attribute"))
  1054. typeRefName.RemoveFromEnd(9);
  1055. }
  1056. if (typeRefName.StartsWith("System."))
  1057. typeRefName.Remove(0, 7);
  1058. return typeRefName;
  1059. }
  1060. //////////////////////////////////////////////////////////////////////////
  1061. BfPropertyMethodDeclaration* BfPropertyDeclaration::GetMethod(const StringImpl& findName)
  1062. {
  1063. String methodName;
  1064. for (auto& methodDeclaration : mMethods)
  1065. {
  1066. if (methodDeclaration->mNameNode != NULL)
  1067. {
  1068. methodName.Clear();
  1069. methodDeclaration->mNameNode->ToString(methodName);
  1070. if (methodName == findName)
  1071. return methodDeclaration;
  1072. }
  1073. }
  1074. return NULL;
  1075. }
  1076. //////////////////////////////////////////////////////////////////////////
  1077. bool BfExpression::VerifyIsStatement(BfPassInstance* passInstance, bool ignoreError)
  1078. {
  1079. if (auto attribExpr = BfNodeDynCast<BfAttributedExpression>(this))
  1080. {
  1081. return attribExpr->mExpression->VerifyIsStatement(passInstance, ignoreError);
  1082. }
  1083. if ((!BfNodeIsExact<BfAssignmentExpression>(this)) &&
  1084. (!BfNodeIsExact<BfInvocationExpression>(this)) &&
  1085. (!BfNodeIsExact<BfObjectCreateExpression>(this)))
  1086. {
  1087. if (auto castExpr = BfNodeDynCast<BfCastExpression>(this))
  1088. {
  1089. if ((castExpr->mTypeRef != NULL) && (castExpr->mTypeRef->ToString() == "void"))
  1090. {
  1091. // Is "(void)variable;" expression, used to remove warning about unused local variables
  1092. return false;
  1093. }
  1094. }
  1095. if (!ignoreError)
  1096. passInstance->Fail("This expression cannot be used as a statement", this);
  1097. //passInstance->Fail("Only assignment, call, increment, decrement, and allocation expressions can be used as a statement", this);
  1098. return false;
  1099. }
  1100. return true;
  1101. }
  1102. //////////////////////////////////////////////////////////////////////////
  1103. bool BfAttributeDirective::Contains(const StringImpl& findName)
  1104. {
  1105. StringT<128> name;
  1106. auto attrDirective = this;
  1107. while (attrDirective != NULL)
  1108. {
  1109. name.clear();
  1110. if (attrDirective->mAttributeTypeRef != NULL)
  1111. attrDirective->mAttributeTypeRef->ToString(name);
  1112. if (findName == name)
  1113. return true;
  1114. if (name.EndsWith("Attribute"))
  1115. {
  1116. int attribNameStart = (int)name.LastIndexOf('.');
  1117. if (attribNameStart != -1)
  1118. name.Remove(0, attribNameStart + 1);
  1119. name.RemoveToEnd(name.length() - 9);
  1120. if (findName == name)
  1121. return true;
  1122. }
  1123. attrDirective = attrDirective->mNextAttribute;
  1124. }
  1125. return false;
  1126. }
  1127. //////////////////////////////////////////////////////////////////////////
  1128. const char* Beefy::BfTokenToString(BfToken token)
  1129. {
  1130. switch (token)
  1131. {
  1132. case BfToken_Abstract:
  1133. return "abstract";
  1134. case BfToken_AlignOf:
  1135. return "alignof";
  1136. case BfToken_AllocType:
  1137. return "alloctype";
  1138. case BfToken_Append:
  1139. return "append";
  1140. case BfToken_As:
  1141. return "as";
  1142. case BfToken_Asm:
  1143. return "asm";
  1144. case BfToken_AsmNewline:
  1145. return "\n";
  1146. case BfToken_Base:
  1147. return "base";
  1148. case BfToken_Box:
  1149. return "box";
  1150. case BfToken_Break:
  1151. return "break";
  1152. case BfToken_Case:
  1153. return "case";
  1154. case BfToken_Catch:
  1155. return "catch";
  1156. case BfToken_Checked:
  1157. return "checked";
  1158. case BfToken_Class:
  1159. return "class";
  1160. case BfToken_Comptype:
  1161. return "comptype";
  1162. case BfToken_Concrete:
  1163. return "concrete";
  1164. case BfToken_Const:
  1165. return "const";
  1166. case BfToken_Continue:
  1167. return "continue";
  1168. case BfToken_Decltype:
  1169. return "decltype";
  1170. case BfToken_Default:
  1171. return "default";
  1172. case BfToken_Defer:
  1173. return "defer";
  1174. case BfToken_Delegate:
  1175. return "delegate";
  1176. case BfToken_Delete:
  1177. return "delete";
  1178. case BfToken_Do:
  1179. return "do";
  1180. case BfToken_Else:
  1181. return "else";
  1182. case BfToken_Enum:
  1183. return "enum";
  1184. case BfToken_Explicit:
  1185. return "explicit";
  1186. case BfToken_Extern:
  1187. return "extern";
  1188. case BfToken_Extension:
  1189. return "extension";
  1190. case BfToken_Fallthrough:
  1191. return "fallthrough";
  1192. case BfToken_Finally:
  1193. return "finally";
  1194. case BfToken_Fixed:
  1195. return "fixed";
  1196. case BfToken_For:
  1197. return "for";
  1198. case BfToken_Function:
  1199. return "function";
  1200. case BfToken_Goto:
  1201. return "goto";
  1202. case BfToken_If:
  1203. return "if";
  1204. case BfToken_Implicit:
  1205. return "implicit";
  1206. case BfToken_In:
  1207. return "in";
  1208. case BfToken_Interface:
  1209. return "interface";
  1210. case BfToken_Internal:
  1211. return "internal";
  1212. case BfToken_Is:
  1213. return "is";
  1214. case BfToken_IsConst:
  1215. return "isconst";
  1216. case BfToken_Let:
  1217. return "let";
  1218. case BfToken_Mixin:
  1219. return "mixin";
  1220. case BfToken_Mut:
  1221. return "mut";
  1222. case BfToken_NameOf:
  1223. return "nameof";
  1224. case BfToken_Namespace:
  1225. return "namespace";
  1226. case BfToken_New:
  1227. return "new";
  1228. case BfToken_Not:
  1229. return "not";
  1230. case BfToken_Null:
  1231. return "null";
  1232. case BfToken_Nullable:
  1233. return "nullable";
  1234. case BfToken_OffsetOf:
  1235. return "offsetof";
  1236. case BfToken_Operator:
  1237. return "operator";
  1238. case BfToken_Out:
  1239. return "out";
  1240. case BfToken_Override:
  1241. return "override";
  1242. case BfToken_Params:
  1243. return "params";
  1244. case BfToken_Private:
  1245. return "private";
  1246. case BfToken_Protected:
  1247. return "protected";
  1248. case BfToken_Public:
  1249. return "public";
  1250. case BfToken_ReadOnly:
  1251. return "readonly";
  1252. case BfToken_Repeat:
  1253. return "repeat";
  1254. case BfToken_Ref:
  1255. return "ref";
  1256. case BfToken_RetType:
  1257. return "rettype";
  1258. case BfToken_Return:
  1259. return "return";
  1260. case BfToken_Scope:
  1261. return "scope";
  1262. case BfToken_Sealed:
  1263. return "sealed";
  1264. case BfToken_SizeOf:
  1265. return "sizeof";
  1266. case BfToken_Static:
  1267. return "static";
  1268. case BfToken_StrideOf:
  1269. return "strideof";
  1270. case BfToken_Struct:
  1271. return "struct";
  1272. case BfToken_Switch:
  1273. return "switch";
  1274. case BfToken_This:
  1275. return "this";
  1276. case BfToken_Throw:
  1277. return "throw";
  1278. case BfToken_Try:
  1279. return "try";
  1280. case BfToken_TypeAlias:
  1281. return "typealias";
  1282. case BfToken_TypeOf:
  1283. return "typeof";
  1284. case BfToken_Unchecked:
  1285. return "unchecked";
  1286. case BfToken_Unsigned:
  1287. return "unsigned";
  1288. case BfToken_Using:
  1289. return "using";
  1290. case BfToken_Var:
  1291. return "var";
  1292. case BfToken_Virtual:
  1293. return "virtual";
  1294. case BfToken_Volatile:
  1295. return "volatile";
  1296. case BfToken_When:
  1297. return "when";
  1298. case BfToken_Where:
  1299. return "where";
  1300. case BfToken_While:
  1301. return "while";
  1302. case BfToken_Yield:
  1303. return "yield";
  1304. case BfToken_AssignEquals:
  1305. return "=";
  1306. case BfToken_CompareEquals:
  1307. return "==";
  1308. case BfToken_CompareStrictEquals:
  1309. return "===";
  1310. case BfToken_CompareNotEquals:
  1311. return "!=";
  1312. case BfToken_CompareStrictNotEquals:
  1313. return "!==";
  1314. case BfToken_LessEquals:
  1315. return "<=";
  1316. case BfToken_GreaterEquals:
  1317. return ">=";
  1318. case BfToken_Spaceship:
  1319. return "<=>";
  1320. case BfToken_PlusEquals:
  1321. return "+=";
  1322. case BfToken_MinusEquals:
  1323. return "-=";
  1324. case BfToken_MultiplyEquals:
  1325. return "*=";
  1326. case BfToken_DivideEquals:
  1327. return "/=";
  1328. case BfToken_ModulusEquals:
  1329. return "%=";
  1330. case BfToken_ShiftLeftEquals:
  1331. return "<<=";
  1332. case BfToken_ShiftRightEquals:
  1333. return ">>=";
  1334. case BfToken_AndEquals:
  1335. return "&=";
  1336. case BfToken_AndMinus:
  1337. return "&-";
  1338. case BfToken_AndPlus:
  1339. return "&+";
  1340. case BfToken_AndStar:
  1341. return "&*";
  1342. case BfToken_AndMinusEquals:
  1343. return "&-=";
  1344. case BfToken_AndPlusEquals:
  1345. return "&+=";
  1346. case BfToken_AndStarEquals:
  1347. return "&*=";
  1348. case BfToken_OrEquals:
  1349. return "|=";
  1350. case BfToken_XorEquals:
  1351. return "^=";
  1352. case BfToken_NullCoalsceEquals:
  1353. return "\?\?=";
  1354. case BfToken_LBrace:
  1355. return "{";
  1356. case BfToken_RBrace:
  1357. return "}";
  1358. case BfToken_LParen:
  1359. return "(";
  1360. case BfToken_RParen:
  1361. return ")";
  1362. case BfToken_LBracket:
  1363. return "[";
  1364. case BfToken_RBracket:
  1365. return "]";
  1366. case BfToken_LChevron:
  1367. return "<";
  1368. case BfToken_RChevron:
  1369. return ">";
  1370. case BfToken_LDblChevron:
  1371. return "<<";
  1372. case BfToken_RDblChevron:
  1373. return ">>";
  1374. case BfToken_Semicolon:
  1375. return ";";
  1376. case BfToken_Colon:
  1377. return ":";
  1378. case BfToken_ColonColon:
  1379. return "::";
  1380. case BfToken_Comma:
  1381. return ",";
  1382. case BfToken_Dot:
  1383. case BfToken_AutocompleteDot:
  1384. return ".";
  1385. case BfToken_DotDot:
  1386. return "..";
  1387. case BfToken_DotDotDot:
  1388. return "...";
  1389. case BfToken_DotDotLess:
  1390. return "..<";
  1391. case BfToken_QuestionDot:
  1392. return "?.";
  1393. case BfToken_QuestionLBracket:
  1394. return "?[";
  1395. case BfToken_Plus:
  1396. return "+";
  1397. case BfToken_Minus:
  1398. return "-";
  1399. case BfToken_DblPlus:
  1400. return "++";
  1401. case BfToken_DblMinus:
  1402. return "--";
  1403. case BfToken_Star:
  1404. return "*";
  1405. case BfToken_ForwardSlash:
  1406. return "/";
  1407. case BfToken_Modulus:
  1408. return "%";
  1409. case BfToken_Ampersand:
  1410. return "&";
  1411. case BfToken_At:
  1412. return "@";
  1413. case BfToken_DblAmpersand:
  1414. return "&&";
  1415. case BfToken_Bar:
  1416. return "|";
  1417. case BfToken_DblBar:
  1418. return "||";
  1419. case BfToken_Bang:
  1420. return "!";
  1421. case BfToken_Carat:
  1422. return "^";
  1423. case BfToken_Tilde:
  1424. return "~";
  1425. case BfToken_Question:
  1426. return "?";
  1427. case BfToken_DblQuestion:
  1428. return "??";
  1429. case BfToken_Arrow:
  1430. return "->";
  1431. case BfToken_FatArrow:
  1432. return "=>";
  1433. default:
  1434. break;
  1435. }
  1436. BF_FATAL("Unknown token");
  1437. return NULL;
  1438. }
  1439. bool Beefy::BfTokenIsKeyword(BfToken token)
  1440. {
  1441. return (token >= BfToken_Abstract) && (token <= BfToken_Yield);
  1442. }
  1443. bool Beefy::BfTokenIsTypeDecl(BfToken token)
  1444. {
  1445. return (token == BfToken_Struct) || (token == BfToken_Class) || (token == BfToken_Interface) || (token == BfToken_Enum);
  1446. }
  1447. BfBinaryOp Beefy::BfAssignOpToBinaryOp(BfAssignmentOp assignmentOp)
  1448. {
  1449. switch (assignmentOp)
  1450. {
  1451. case BfAssignmentOp_Add:
  1452. return BfBinaryOp_Add;
  1453. case BfAssignmentOp_Subtract:
  1454. return BfBinaryOp_Subtract;
  1455. case BfAssignmentOp_Multiply:
  1456. return BfBinaryOp_Multiply;
  1457. case BfAssignmentOp_Divide:
  1458. return BfBinaryOp_Divide;
  1459. case BfAssignmentOp_OverflowAdd:
  1460. return BfBinaryOp_OverflowAdd;
  1461. case BfAssignmentOp_OverflowSubtract:
  1462. return BfBinaryOp_OverflowSubtract;
  1463. case BfAssignmentOp_OverflowMultiply:
  1464. return BfBinaryOp_OverflowMultiply;
  1465. case BfAssignmentOp_Modulus:
  1466. return BfBinaryOp_Modulus;
  1467. case BfAssignmentOp_ShiftLeft:
  1468. return BfBinaryOp_LeftShift;
  1469. case BfAssignmentOp_ShiftRight:
  1470. return BfBinaryOp_RightShift;
  1471. case BfAssignmentOp_BitwiseAnd:
  1472. return BfBinaryOp_BitwiseAnd;
  1473. case BfAssignmentOp_BitwiseOr:
  1474. return BfBinaryOp_BitwiseOr;
  1475. case BfAssignmentOp_ExclusiveOr:
  1476. return BfBinaryOp_ExclusiveOr;
  1477. case BfAssignmentOp_NullCoalesce:
  1478. return BfBinaryOp_NullCoalesce;
  1479. default:
  1480. break;
  1481. }
  1482. return BfBinaryOp_None;
  1483. }
  1484. int Beefy::BfGetBinaryOpPrecendence(BfBinaryOp binOp)
  1485. {
  1486. switch (binOp)
  1487. {
  1488. case BfBinaryOp_Multiply:
  1489. case BfBinaryOp_OverflowMultiply:
  1490. case BfBinaryOp_Divide:
  1491. case BfBinaryOp_Modulus:
  1492. return 14;
  1493. case BfBinaryOp_Add:
  1494. case BfBinaryOp_Subtract:
  1495. case BfBinaryOp_OverflowAdd:
  1496. case BfBinaryOp_OverflowSubtract:
  1497. return 13;
  1498. case BfBinaryOp_LeftShift:
  1499. case BfBinaryOp_RightShift:
  1500. return 12;
  1501. case BfBinaryOp_BitwiseAnd:
  1502. return 11;
  1503. case BfBinaryOp_ExclusiveOr:
  1504. return 10;
  1505. case BfBinaryOp_BitwiseOr:
  1506. return 9;
  1507. case BfBinaryOp_Range:
  1508. case BfBinaryOp_ClosedRange:
  1509. return 8;
  1510. case BfBinaryOp_Is:
  1511. case BfBinaryOp_As:
  1512. return 7;
  1513. case BfBinaryOp_Compare:
  1514. return 6;
  1515. case BfBinaryOp_GreaterThan:
  1516. case BfBinaryOp_LessThan:
  1517. case BfBinaryOp_GreaterThanOrEqual:
  1518. case BfBinaryOp_LessThanOrEqual:
  1519. return 5;
  1520. case BfBinaryOp_Equality:
  1521. case BfBinaryOp_StrictEquality:
  1522. case BfBinaryOp_InEquality:
  1523. case BfBinaryOp_StrictInEquality:
  1524. return 4;
  1525. case BfBinaryOp_ConditionalAnd:
  1526. return 3;
  1527. case BfBinaryOp_ConditionalOr:
  1528. return 2;
  1529. case BfBinaryOp_NullCoalesce:
  1530. return 1;
  1531. default:
  1532. break;
  1533. }
  1534. return 0;
  1535. }
  1536. const char* Beefy::BfGetOpName(BfBinaryOp binOp)
  1537. {
  1538. switch (binOp)
  1539. {
  1540. case BfBinaryOp_None: return "";
  1541. case BfBinaryOp_Add: return "+";
  1542. case BfBinaryOp_Subtract: return "-";
  1543. case BfBinaryOp_Multiply: return "*";
  1544. case BfBinaryOp_OverflowAdd: return "&+";
  1545. case BfBinaryOp_OverflowSubtract: return "&-";
  1546. case BfBinaryOp_OverflowMultiply: return "&*";
  1547. case BfBinaryOp_Divide: return "/";
  1548. case BfBinaryOp_Modulus: return "%";
  1549. case BfBinaryOp_BitwiseAnd: return "&";
  1550. case BfBinaryOp_BitwiseOr: return "|";
  1551. case BfBinaryOp_ExclusiveOr: return "^";
  1552. case BfBinaryOp_LeftShift: return "<<";
  1553. case BfBinaryOp_RightShift: return ">>";
  1554. case BfBinaryOp_Equality: return "==";
  1555. case BfBinaryOp_StrictEquality: return "===";
  1556. case BfBinaryOp_InEquality: return "!=";
  1557. case BfBinaryOp_StrictInEquality: return "!==";
  1558. case BfBinaryOp_GreaterThan: return ">";
  1559. case BfBinaryOp_LessThan: return "<";
  1560. case BfBinaryOp_GreaterThanOrEqual: return ">=";
  1561. case BfBinaryOp_LessThanOrEqual: return "<=";
  1562. case BfBinaryOp_Compare: return "<=>";
  1563. case BfBinaryOp_ConditionalAnd: return "&&";
  1564. case BfBinaryOp_ConditionalOr: return "||";
  1565. case BfBinaryOp_NullCoalesce: return "??";
  1566. case BfBinaryOp_Is: return "is";
  1567. case BfBinaryOp_As: return "as";
  1568. case BfBinaryOp_Range: return "..<";
  1569. case BfBinaryOp_ClosedRange: return "...";
  1570. default: return "???";
  1571. }
  1572. }
  1573. const char* Beefy::BfGetOpName(BfUnaryOp unaryOp)
  1574. {
  1575. switch (unaryOp)
  1576. {
  1577. case BfUnaryOp_None: return "";
  1578. case BfUnaryOp_AddressOf: return "&";
  1579. case BfUnaryOp_Arrow: return "->";
  1580. case BfUnaryOp_Dereference: return "*";
  1581. case BfUnaryOp_Negate: return "-";
  1582. case BfUnaryOp_Not: return "!";
  1583. case BfUnaryOp_Positive: return "+";
  1584. case BfUnaryOp_InvertBits: return "~";
  1585. case BfUnaryOp_Increment: return "++";
  1586. case BfUnaryOp_Decrement: return "--";
  1587. case BfUnaryOp_PostIncrement: return "++";
  1588. case BfUnaryOp_PostDecrement: return "--";
  1589. case BfUnaryOp_NullConditional: return "?";
  1590. case BfUnaryOp_Ref: return "ref";
  1591. case BfUnaryOp_Out: return "out";
  1592. case BfUnaryOp_Mut: return "mut";
  1593. case BfUnaryOp_Params: return "params";
  1594. case BfUnaryOp_Cascade: return "..";
  1595. case BfUnaryOp_FromEnd: return "^";
  1596. case BfUnaryOp_PartialRangeUpTo: return "..<";
  1597. case BfUnaryOp_PartialRangeThrough: return "...";
  1598. case BfUnaryOp_PartialRangeFrom: return "...";
  1599. default: return "???";
  1600. }
  1601. }
  1602. BfBinaryOp Beefy::BfTokenToBinaryOp(BfToken token)
  1603. {
  1604. switch (token)
  1605. {
  1606. case BfToken_Plus:
  1607. return BfBinaryOp_Add;
  1608. case BfToken_Minus:
  1609. return BfBinaryOp_Subtract;
  1610. case BfToken_Star:
  1611. return BfBinaryOp_Multiply;
  1612. case BfToken_AndPlus:
  1613. return BfBinaryOp_OverflowAdd;
  1614. case BfToken_AndMinus:
  1615. return BfBinaryOp_OverflowSubtract;
  1616. case BfToken_AndStar:
  1617. return BfBinaryOp_OverflowMultiply;
  1618. case BfToken_ForwardSlash:
  1619. return BfBinaryOp_Divide;
  1620. case BfToken_Modulus:
  1621. return BfBinaryOp_Modulus;
  1622. case BfToken_Ampersand:
  1623. return BfBinaryOp_BitwiseAnd;
  1624. case BfToken_Bar:
  1625. return BfBinaryOp_BitwiseOr;
  1626. case BfToken_Carat:
  1627. return BfBinaryOp_ExclusiveOr;
  1628. case BfToken_LDblChevron:
  1629. return BfBinaryOp_LeftShift;
  1630. case BfToken_RDblChevron:
  1631. return BfBinaryOp_RightShift;
  1632. case BfToken_CompareEquals:
  1633. return BfBinaryOp_Equality;
  1634. case BfToken_CompareStrictEquals:
  1635. return BfBinaryOp_StrictEquality;
  1636. case BfToken_CompareNotEquals:
  1637. return BfBinaryOp_InEquality;
  1638. case BfToken_CompareStrictNotEquals:
  1639. return BfBinaryOp_StrictInEquality;
  1640. case BfToken_RChevron:
  1641. return BfBinaryOp_GreaterThan;
  1642. case BfToken_LChevron:
  1643. return BfBinaryOp_LessThan;
  1644. case BfToken_GreaterEquals:
  1645. return BfBinaryOp_GreaterThanOrEqual;
  1646. case BfToken_LessEquals:
  1647. return BfBinaryOp_LessThanOrEqual;
  1648. case BfToken_Spaceship:
  1649. return BfBinaryOp_Compare;
  1650. case BfToken_DblAmpersand:
  1651. return BfBinaryOp_ConditionalAnd;
  1652. case BfToken_DblBar:
  1653. return BfBinaryOp_ConditionalOr;
  1654. case BfToken_DblQuestion:
  1655. return BfBinaryOp_NullCoalesce;
  1656. case BfToken_DotDotLess:
  1657. return BfBinaryOp_Range;
  1658. case BfToken_DotDotDot:
  1659. return BfBinaryOp_ClosedRange;
  1660. default:
  1661. return BfBinaryOp_None;
  1662. }
  1663. }
  1664. BfUnaryOp Beefy::BfTokenToUnaryOp(BfToken token)
  1665. {
  1666. switch (token)
  1667. {
  1668. case BfToken_Star:
  1669. return BfUnaryOp_Dereference;
  1670. case BfToken_Ampersand:
  1671. return BfUnaryOp_AddressOf;
  1672. case BfToken_Arrow:
  1673. return BfUnaryOp_Arrow;
  1674. case BfToken_Minus:
  1675. return BfUnaryOp_Negate;
  1676. case BfToken_Bang:
  1677. return BfUnaryOp_Not;
  1678. case BfToken_Plus:
  1679. return BfUnaryOp_Positive;
  1680. case BfToken_Tilde:
  1681. return BfUnaryOp_InvertBits;
  1682. case BfToken_DblPlus:
  1683. return BfUnaryOp_Increment;
  1684. case BfToken_DblMinus:
  1685. return BfUnaryOp_Decrement;
  1686. case BfToken_Question:
  1687. return BfUnaryOp_NullConditional;
  1688. case BfToken_Ref:
  1689. return BfUnaryOp_Ref;
  1690. case BfToken_Mut:
  1691. return BfUnaryOp_Mut;
  1692. case BfToken_Out:
  1693. return BfUnaryOp_Out;
  1694. case BfToken_Params:
  1695. return BfUnaryOp_Params;
  1696. case BfToken_DotDot:
  1697. return BfUnaryOp_Cascade;
  1698. case BfToken_Carat:
  1699. return BfUnaryOp_FromEnd;
  1700. case BfToken_DotDotDot:
  1701. return BfUnaryOp_PartialRangeThrough;
  1702. case BfToken_DotDotLess:
  1703. return BfUnaryOp_PartialRangeUpTo;
  1704. default:
  1705. return BfUnaryOp_None;
  1706. }
  1707. }
  1708. bool Beefy::BfCanOverloadOperator(BfUnaryOp unaryOp)
  1709. {
  1710. switch (unaryOp)
  1711. {
  1712. case BfUnaryOp_Negate:
  1713. case BfUnaryOp_Not:
  1714. case BfUnaryOp_Positive:
  1715. case BfUnaryOp_InvertBits:
  1716. case BfUnaryOp_Increment:
  1717. case BfUnaryOp_Decrement:
  1718. case BfUnaryOp_PostIncrement:
  1719. case BfUnaryOp_PostDecrement:
  1720. case BfUnaryOp_NullConditional:
  1721. return true;
  1722. default:
  1723. return false;
  1724. }
  1725. }
  1726. BfAssignmentOp Beefy::BfTokenToAssignmentOp(BfToken token)
  1727. {
  1728. switch (token)
  1729. {
  1730. case BfToken_AssignEquals:
  1731. return BfAssignmentOp_Assign;
  1732. case BfToken_PlusEquals:
  1733. return BfAssignmentOp_Add;
  1734. case BfToken_MinusEquals:
  1735. return BfAssignmentOp_Subtract;
  1736. case BfToken_MultiplyEquals:
  1737. return BfAssignmentOp_Multiply;
  1738. case BfToken_AndPlusEquals:
  1739. return BfAssignmentOp_OverflowAdd;
  1740. case BfToken_AndMinusEquals:
  1741. return BfAssignmentOp_OverflowSubtract;
  1742. case BfToken_AndStarEquals:
  1743. return BfAssignmentOp_OverflowMultiply;
  1744. case BfToken_DivideEquals:
  1745. return BfAssignmentOp_Divide;
  1746. case BfToken_ModulusEquals:
  1747. return BfAssignmentOp_Modulus;
  1748. case BfToken_ShiftLeftEquals:
  1749. return BfAssignmentOp_ShiftLeft;
  1750. case BfToken_ShiftRightEquals:
  1751. return BfAssignmentOp_ShiftRight;
  1752. case BfToken_AndEquals:
  1753. return BfAssignmentOp_BitwiseAnd;
  1754. case BfToken_OrEquals:
  1755. return BfAssignmentOp_BitwiseOr;
  1756. case BfToken_XorEquals:
  1757. return BfAssignmentOp_ExclusiveOr;
  1758. case BfToken_NullCoalsceEquals:
  1759. return BfAssignmentOp_NullCoalesce;
  1760. default:
  1761. return BfAssignmentOp_None;
  1762. }
  1763. }
  1764. BfBinaryOp Beefy::BfGetOppositeBinaryOp(BfBinaryOp origOp)
  1765. {
  1766. switch (origOp)
  1767. {
  1768. case BfBinaryOp_Equality:
  1769. return BfBinaryOp_InEquality;
  1770. case BfBinaryOp_StrictEquality:
  1771. return BfBinaryOp_StrictInEquality;
  1772. case BfBinaryOp_InEquality:
  1773. return BfBinaryOp_Equality;
  1774. case BfBinaryOp_StrictInEquality:
  1775. return BfBinaryOp_StrictEquality;
  1776. case BfBinaryOp_LessThan:
  1777. return BfBinaryOp_GreaterThanOrEqual;
  1778. case BfBinaryOp_LessThanOrEqual:
  1779. return BfBinaryOp_GreaterThan;
  1780. case BfBinaryOp_GreaterThan:
  1781. return BfBinaryOp_LessThanOrEqual;
  1782. case BfBinaryOp_GreaterThanOrEqual:
  1783. return BfBinaryOp_LessThan;
  1784. default: break;
  1785. }
  1786. return BfBinaryOp_None;
  1787. }
  1788. BfBinaryOp Beefy::BfGetFlippedBinaryOp(BfBinaryOp origOp)
  1789. {
  1790. switch (origOp)
  1791. {
  1792. case BfBinaryOp_Equality:
  1793. return BfBinaryOp_Equality;
  1794. case BfBinaryOp_InEquality:
  1795. return BfBinaryOp_InEquality;
  1796. case BfBinaryOp_LessThan:
  1797. return BfBinaryOp_GreaterThan;
  1798. case BfBinaryOp_LessThanOrEqual:
  1799. return BfBinaryOp_GreaterThanOrEqual;
  1800. case BfBinaryOp_GreaterThan:
  1801. return BfBinaryOp_LessThan;
  1802. case BfBinaryOp_GreaterThanOrEqual:
  1803. return BfBinaryOp_LessThanOrEqual;
  1804. default: break;
  1805. }
  1806. return BfBinaryOp_None;
  1807. }
  1808. bool Beefy::BfBinOpEqualityCheck(BfBinaryOp binOp)
  1809. {
  1810. return (binOp >= BfBinaryOp_Equality) && (binOp <= BfBinaryOp_StrictInEquality);
  1811. }
  1812. bool Beefy::BfIsCommentBlock(BfCommentKind commentKind)
  1813. {
  1814. return
  1815. (commentKind == BfCommentKind_Block) ||
  1816. (commentKind == BfCommentKind_Documentation_Block_Pre) ||
  1817. (commentKind == BfCommentKind_Documentation_Block_Post);
  1818. }
  1819. BfInlineAsmInstruction::AsmArg::AsmArg()
  1820. : mType(ARGTYPE_Immediate)
  1821. , mMemFlags(0)
  1822. , mInt(0)
  1823. , mAdjRegScalar(1)
  1824. {}
  1825. #pragma warning(disable:4996)
  1826. String BfInlineAsmInstruction::AsmArg::ToString()
  1827. {
  1828. String s;
  1829. if (!mSizePrefix.empty())
  1830. {
  1831. s += mSizePrefix;
  1832. s += " ptr ";
  1833. }
  1834. if (!mSegPrefix.empty())
  1835. {
  1836. s += mSegPrefix;
  1837. s += ":";
  1838. }
  1839. switch(mType)
  1840. {
  1841. case ARGTYPE_Immediate:
  1842. {
  1843. char buf[64];
  1844. sprintf(buf, "%d", mInt);
  1845. s += buf;
  1846. }
  1847. break;
  1848. case ARGTYPE_FloatReg:
  1849. {
  1850. char buf[64];
  1851. sprintf(buf, "st(%d)", mInt);
  1852. s += buf;
  1853. }
  1854. break;
  1855. case ARGTYPE_IntReg:
  1856. {
  1857. s += mReg;
  1858. }
  1859. break;
  1860. case ARGTYPE_Memory:
  1861. {
  1862. s += "[";
  1863. if (mMemFlags & ARGMEMF_BaseReg)
  1864. {
  1865. s += mReg;
  1866. if (mMemFlags != ARGMEMF_BaseReg)
  1867. s += " + ";
  1868. }
  1869. if (mMemFlags & ARGMEMF_AdjReg)
  1870. {
  1871. s += mAdjReg;
  1872. if (mAdjRegScalar != 1)
  1873. {
  1874. char buf[64];
  1875. sprintf(buf, "%d", mAdjRegScalar);
  1876. s += "*";
  1877. s += buf;
  1878. }
  1879. if (mMemFlags & ARGMEMF_ImmediateDisp)
  1880. s += " + ";
  1881. }
  1882. if (mMemFlags & ARGMEMF_ImmediateDisp)
  1883. {
  1884. char buf[64];
  1885. sprintf(buf, "%d", mInt);
  1886. s += buf;
  1887. }
  1888. s += "]";
  1889. if (!mMemberSuffix.empty())
  1890. {
  1891. s += ".";
  1892. s += mMemberSuffix;
  1893. }
  1894. }
  1895. break;
  1896. }
  1897. return s;
  1898. }
  1899. BfInlineAsmInstruction::AsmInst::AsmInst()
  1900. : mDebugLine(0)
  1901. {}
  1902. String BfInlineAsmInstruction::AsmInst::ToString()
  1903. {
  1904. String s;
  1905. if (!mLabel.empty())
  1906. {
  1907. s += mLabel;
  1908. s += ": ";
  1909. }
  1910. for (auto const& p : mOpPrefixes)
  1911. {
  1912. s += p;
  1913. s += " ";
  1914. }
  1915. s += mOpCode;
  1916. s += " ";
  1917. for (int i=0; i<(int)mArgs.size(); ++i)
  1918. {
  1919. if (i > 0)
  1920. s += ", ";
  1921. s += mArgs[i].ToString();
  1922. }
  1923. return s;
  1924. }