BfAst.cpp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683
  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(BfScopeNode* scopeNode)
  44. {
  45. Visit(scopeNode->ToBase());
  46. }
  47. void BfStructuralVisitor::Visit(BfNewNode* newNode)
  48. {
  49. Visit(newNode->ToBase());
  50. }
  51. void BfStructuralVisitor::Visit(BfTypedValueExpression* typedValueExpr)
  52. {
  53. Visit(typedValueExpr->ToBase());
  54. }
  55. void BfStructuralVisitor::Visit(BfCommentNode* commentNode)
  56. {
  57. Visit(commentNode->ToBase());
  58. }
  59. void BfStructuralVisitor::Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection)
  60. {
  61. Visit(preprocesorIgnoredSection->ToBase());
  62. }
  63. void BfStructuralVisitor::Visit(BfPreprocessorNode* preprocessorNode)
  64. {
  65. Visit(preprocessorNode->ToBase());
  66. }
  67. void BfStructuralVisitor::Visit(BfPreprocessorDefinedExpression* definedExpr)
  68. {
  69. Visit(definedExpr->ToBase());
  70. }
  71. void BfStructuralVisitor::Visit(BfAttributeDirective* attributeDirective)
  72. {
  73. Visit(attributeDirective->ToBase());
  74. }
  75. void BfStructuralVisitor::Visit(BfGenericParamsDeclaration* genericParams)
  76. {
  77. Visit(genericParams->ToBase());
  78. }
  79. void BfStructuralVisitor::Visit(BfGenericConstraintsDeclaration* genericConstraints)
  80. {
  81. Visit(genericConstraints->ToBase());
  82. }
  83. void BfStructuralVisitor::Visit(BfGenericArgumentsNode* genericArgumentsNode)
  84. {
  85. Visit(genericArgumentsNode->ToBase());
  86. }
  87. void BfStructuralVisitor::Visit(BfStatement* stmt)
  88. {
  89. Visit(stmt->ToBase());
  90. }
  91. void BfStructuralVisitor::Visit(BfLabelableStatement* labelableStmt)
  92. {
  93. Visit(labelableStmt->ToBase());
  94. }
  95. void BfStructuralVisitor::Visit(BfExpression* expr)
  96. {
  97. Visit(expr->ToBase());
  98. }
  99. void BfStructuralVisitor::Visit(BfExpressionStatement* exprStmt)
  100. {
  101. Visit(exprStmt->ToBase());
  102. }
  103. void BfStructuralVisitor::Visit(BfAttributedExpression* attribExpr)
  104. {
  105. Visit(attribExpr->ToBase());
  106. }
  107. void BfStructuralVisitor::Visit(BfEmptyStatement* emptyStmt)
  108. {
  109. Visit(emptyStmt->ToBase());
  110. }
  111. void BfStructuralVisitor::Visit(BfTokenNode* tokenNode)
  112. {
  113. Visit(tokenNode->ToBase());
  114. }
  115. void BfStructuralVisitor::Visit(BfTokenPairNode* tokenPairNode)
  116. {
  117. Visit(tokenPairNode->ToBase());
  118. }
  119. void BfStructuralVisitor::Visit(BfLiteralExpression* literalExpr)
  120. {
  121. Visit(literalExpr->ToBase());
  122. }
  123. void BfStructuralVisitor::Visit(BfIdentifierNode* identifierNode)
  124. {
  125. Visit(identifierNode->ToBase());
  126. }
  127. void BfStructuralVisitor::Visit(BfAttributedIdentifierNode* attrIdentifierNode)
  128. {
  129. Visit(attrIdentifierNode->ToBase());
  130. }
  131. void BfStructuralVisitor::Visit(BfQualifiedNameNode* nameNode)
  132. {
  133. Visit(nameNode->ToBase());
  134. }
  135. void BfStructuralVisitor::Visit(BfThisExpression* thisExpr)
  136. {
  137. Visit(thisExpr->ToBase());
  138. }
  139. void BfStructuralVisitor::Visit(BfBaseExpression* baseExpr)
  140. {
  141. Visit(baseExpr->ToBase());
  142. }
  143. void BfStructuralVisitor::Visit(BfMixinExpression* mixinExpr)
  144. {
  145. Visit(mixinExpr->ToBase());
  146. }
  147. void BfStructuralVisitor::Visit(BfSizedArrayCreateExpression* createExpr)
  148. {
  149. Visit(createExpr->ToBase());
  150. }
  151. void BfStructuralVisitor::Visit(BfCollectionInitializerExpression* collectionInitExpr)
  152. {
  153. Visit(collectionInitExpr->ToBase());
  154. }
  155. void BfStructuralVisitor::Visit(BfArraySizeSpecifier* arraySizeSpecifier)
  156. {
  157. Visit(arraySizeSpecifier->ToBase());
  158. }
  159. void BfStructuralVisitor::Visit(BfTypeReference* typeRef)
  160. {
  161. Visit(typeRef->ToBase());
  162. }
  163. void BfStructuralVisitor::Visit(BfNamedTypeReference* typeRef)
  164. {
  165. Visit(typeRef->ToBase());
  166. }
  167. void BfStructuralVisitor::Visit(BfQualifiedTypeReference* qualifiedTypeRef)
  168. {
  169. Visit(qualifiedTypeRef->ToBase());
  170. }
  171. void BfStructuralVisitor::Visit(BfDotTypeReference * typeRef)
  172. {
  173. Visit(typeRef->ToBase());
  174. }
  175. void BfStructuralVisitor::Visit(BfVarTypeReference* typeRef)
  176. {
  177. Visit(typeRef->ToBase());
  178. }
  179. void BfStructuralVisitor::Visit(BfVarRefTypeReference* typeRef)
  180. {
  181. Visit(typeRef->ToBase());
  182. }
  183. void BfStructuralVisitor::Visit(BfLetTypeReference* typeRef)
  184. {
  185. Visit(typeRef->ToBase());
  186. }
  187. void BfStructuralVisitor::Visit(BfConstTypeRef* typeRef)
  188. {
  189. Visit(typeRef->ToBase());
  190. }
  191. void BfStructuralVisitor::Visit(BfConstExprTypeRef* typeRef)
  192. {
  193. Visit(typeRef->ToBase());
  194. }
  195. void BfStructuralVisitor::Visit(BfRefTypeRef* typeRef)
  196. {
  197. Visit(typeRef->ToBase());
  198. }
  199. void BfStructuralVisitor::Visit(BfRetTypeTypeRef* typeRef)
  200. {
  201. Visit(typeRef->ToBase());
  202. }
  203. void BfStructuralVisitor::Visit(BfArrayTypeRef* typeRef)
  204. {
  205. Visit(typeRef->ToBase());
  206. }
  207. void BfStructuralVisitor::Visit(BfGenericInstanceTypeRef* typeRef)
  208. {
  209. Visit(typeRef->ToBase());
  210. }
  211. void BfStructuralVisitor::Visit(BfTupleTypeRef* typeRef)
  212. {
  213. Visit(typeRef->ToBase());
  214. }
  215. void BfStructuralVisitor::Visit(BfDelegateTypeRef* typeRef)
  216. {
  217. Visit(typeRef->ToBase());
  218. }
  219. void BfStructuralVisitor::Visit(BfDeclTypeRef* declTypeRef)
  220. {
  221. Visit(declTypeRef->ToBase());
  222. }
  223. void BfStructuralVisitor::Visit(BfPointerTypeRef* typeRef)
  224. {
  225. Visit(typeRef->ToBase());
  226. }
  227. void BfStructuralVisitor::Visit(BfNullableTypeRef* typeRef)
  228. {
  229. Visit(typeRef->ToBase());
  230. }
  231. void BfStructuralVisitor::Visit(BfVariableDeclaration* varDecl)
  232. {
  233. Visit(varDecl->ToBase());
  234. }
  235. void BfStructuralVisitor::Visit(BfLocalMethodDeclaration* methodDecl)
  236. {
  237. Visit(methodDecl->ToBase());
  238. }
  239. void BfStructuralVisitor::Visit(BfParameterDeclaration* paramDecl)
  240. {
  241. Visit(paramDecl->ToBase());
  242. }
  243. void BfStructuralVisitor::Visit(BfParamsExpression* paramsExpr)
  244. {
  245. Visit(paramsExpr->ToBase());
  246. }
  247. void BfStructuralVisitor::Visit(BfTypeAttrExpression* typeAttrExpr)
  248. {
  249. Visit(typeAttrExpr->ToBase());
  250. }
  251. void BfStructuralVisitor::Visit(BfTypeOfExpression* typeOfExpr)
  252. {
  253. Visit(typeOfExpr->ToBase());
  254. }
  255. void BfStructuralVisitor::Visit(BfSizeOfExpression* sizeOfExpr)
  256. {
  257. Visit(sizeOfExpr->ToBase());
  258. }
  259. void BfStructuralVisitor::Visit(BfAlignOfExpression* alignOfExpr)
  260. {
  261. Visit(alignOfExpr->ToBase());
  262. }
  263. void BfStructuralVisitor::Visit(BfStrideOfExpression* strideOfExpr)
  264. {
  265. Visit(strideOfExpr->ToBase());
  266. }
  267. void BfStructuralVisitor::Visit(BfDefaultExpression* defaultExpr)
  268. {
  269. Visit(defaultExpr->ToBase());
  270. }
  271. void BfStructuralVisitor::Visit(BfUninitializedExpression* uninitializedExpr)
  272. {
  273. Visit(uninitializedExpr->ToBase());
  274. }
  275. void BfStructuralVisitor::Visit(BfCheckTypeExpression* checkTypeExpr)
  276. {
  277. Visit(checkTypeExpr->ToBase());
  278. }
  279. void BfStructuralVisitor::Visit(BfDynamicCastExpression* dynCastExpr)
  280. {
  281. Visit(dynCastExpr->ToBase());
  282. }
  283. void BfStructuralVisitor::Visit(BfCastExpression* castExpr)
  284. {
  285. Visit(castExpr->ToBase());
  286. }
  287. void BfStructuralVisitor::Visit(BfDelegateBindExpression* bindExpr)
  288. {
  289. Visit(bindExpr->ToBase());
  290. }
  291. void BfStructuralVisitor::Visit(BfLambdaBindExpression* lambdaBindExpr)
  292. {
  293. Visit(lambdaBindExpr->ToBase());
  294. }
  295. void BfStructuralVisitor::Visit(BfObjectCreateExpression* newExpr)
  296. {
  297. Visit(newExpr->ToBase());
  298. }
  299. void BfStructuralVisitor::Visit(BfBoxExpression* boxExpr)
  300. {
  301. Visit(boxExpr->ToBase());
  302. }
  303. void BfStructuralVisitor::Visit(BfThrowStatement* throwStmt)
  304. {
  305. Visit(throwStmt->ToBase());
  306. }
  307. void BfStructuralVisitor::Visit(BfDeleteStatement* deleteStmt)
  308. {
  309. Visit(deleteStmt->ToBase());
  310. }
  311. void BfStructuralVisitor::Visit(BfScopedInvocationTarget* scopedTarget)
  312. {
  313. Visit(scopedTarget->ToBase());
  314. }
  315. void BfStructuralVisitor::Visit(BfInvocationExpression* invocationExpr)
  316. {
  317. Visit(invocationExpr->ToBase());
  318. }
  319. void BfStructuralVisitor::Visit(BfEnumCaseBindExpression* caseBindExpr)
  320. {
  321. Visit(caseBindExpr->ToBase());
  322. }
  323. void BfStructuralVisitor::Visit(BfCaseExpression* caseExpr)
  324. {
  325. Visit(caseExpr->ToBase());
  326. }
  327. void BfStructuralVisitor::Visit(BfSwitchCase* switchCase)
  328. {
  329. Visit(switchCase->ToBase());
  330. }
  331. void BfStructuralVisitor::Visit(BfWhenExpression* whenExpr)
  332. {
  333. Visit(whenExpr->ToBase());
  334. }
  335. void BfStructuralVisitor::Visit(BfSwitchStatement* switchStmt)
  336. {
  337. Visit(switchStmt->ToBase());
  338. }
  339. void BfStructuralVisitor::Visit(BfTryStatement* tryStmt)
  340. {
  341. Visit(tryStmt->ToBase());
  342. }
  343. void BfStructuralVisitor::Visit(BfCatchStatement* catchStmt)
  344. {
  345. Visit(catchStmt->ToBase());
  346. }
  347. void BfStructuralVisitor::Visit(BfFinallyStatement* finallyStmt)
  348. {
  349. Visit(finallyStmt->ToBase());
  350. }
  351. void BfStructuralVisitor::Visit(BfCheckedStatement* checkedStmt)
  352. {
  353. Visit(checkedStmt->ToBase());
  354. }
  355. void BfStructuralVisitor::Visit(BfUncheckedStatement* uncheckedStmt)
  356. {
  357. Visit(uncheckedStmt->ToBase());
  358. }
  359. void BfStructuralVisitor::Visit(BfIfStatement* ifStmt)
  360. {
  361. Visit(ifStmt->ToBase());
  362. }
  363. void BfStructuralVisitor::Visit(BfDeferStatement* deferStmt)
  364. {
  365. Visit(deferStmt->ToBase());
  366. }
  367. void BfStructuralVisitor::Visit(BfReturnStatement* returnStmt)
  368. {
  369. Visit(returnStmt->ToBase());
  370. }
  371. void BfStructuralVisitor::Visit(BfYieldStatement* yieldStmt)
  372. {
  373. Visit(yieldStmt->ToBase());
  374. }
  375. void BfStructuralVisitor::Visit(BfUsingStatement* whileStmt)
  376. {
  377. Visit(whileStmt->ToBase());
  378. }
  379. void BfStructuralVisitor::Visit(BfDoStatement* doStmt)
  380. {
  381. Visit(doStmt->ToBase());
  382. }
  383. void BfStructuralVisitor::Visit(BfRepeatStatement* repeatStmt)
  384. {
  385. Visit(repeatStmt->ToBase());
  386. }
  387. void BfStructuralVisitor::Visit(BfWhileStatement* whileStmt)
  388. {
  389. Visit(whileStmt->ToBase());
  390. }
  391. void BfStructuralVisitor::Visit(BfBreakStatement* breakStmt)
  392. {
  393. Visit(breakStmt->ToBase());
  394. }
  395. void BfStructuralVisitor::Visit(BfContinueStatement* continueStmt)
  396. {
  397. Visit(continueStmt->ToBase());
  398. }
  399. void BfStructuralVisitor::Visit(BfFallthroughStatement* fallthroughStmt)
  400. {
  401. Visit(fallthroughStmt->ToBase());
  402. }
  403. void BfStructuralVisitor::Visit(BfForStatement* forStmt)
  404. {
  405. Visit(forStmt->ToBase());
  406. }
  407. void BfStructuralVisitor::Visit(BfForEachStatement* forEachStmt)
  408. {
  409. Visit(forEachStmt->ToBase());
  410. }
  411. void BfStructuralVisitor::Visit(BfConditionalExpression* condExpr)
  412. {
  413. Visit(condExpr->ToBase());
  414. }
  415. void BfStructuralVisitor::Visit(BfAssignmentExpression* assignExpr)
  416. {
  417. Visit(assignExpr->ToBase());
  418. }
  419. void BfStructuralVisitor::Visit(BfParenthesizedExpression* parenExpr)
  420. {
  421. Visit(parenExpr->ToBase());
  422. }
  423. void BfStructuralVisitor::Visit(BfTupleExpression* tupleExpr)
  424. {
  425. Visit(tupleExpr->ToBase());
  426. }
  427. void BfStructuralVisitor::Visit(BfMemberReferenceExpression* memberRefExpr)
  428. {
  429. Visit(memberRefExpr->ToBase());
  430. }
  431. void BfStructuralVisitor::Visit(BfIndexerExpression* indexerExpr)
  432. {
  433. Visit(indexerExpr->ToBase());
  434. }
  435. void BfStructuralVisitor::Visit(BfUnaryOperatorExpression* binOpExpr)
  436. {
  437. Visit(binOpExpr->ToBase());
  438. }
  439. void BfStructuralVisitor::Visit(BfBinaryOperatorExpression* binOpExpr)
  440. {
  441. Visit(binOpExpr->ToBase());
  442. }
  443. void BfStructuralVisitor::Visit(BfConstructorDeclaration* ctorDeclaration)
  444. {
  445. Visit(ctorDeclaration->ToBase());
  446. }
  447. void BfStructuralVisitor::Visit(BfDestructorDeclaration* dtorDeclaration)
  448. {
  449. Visit(dtorDeclaration->ToBase());
  450. }
  451. void BfStructuralVisitor::Visit(BfMethodDeclaration* methodDeclaration)
  452. {
  453. Visit(methodDeclaration->ToBase());
  454. }
  455. void BfStructuralVisitor::Visit(BfOperatorDeclaration* operatorDeclaration)
  456. {
  457. Visit(operatorDeclaration->ToBase());
  458. }
  459. void BfStructuralVisitor::Visit(BfPropertyMethodDeclaration* propertyMethodDeclaration)
  460. {
  461. Visit(propertyMethodDeclaration->ToBase());
  462. }
  463. void BfStructuralVisitor::Visit(BfPropertyBodyExpression* propertyBodyExpression)
  464. {
  465. Visit(propertyBodyExpression->ToBase());
  466. }
  467. void BfStructuralVisitor::Visit(BfPropertyDeclaration* propertyDeclaration)
  468. {
  469. Visit(propertyDeclaration->ToBase());
  470. }
  471. void BfStructuralVisitor::Visit(BfIndexerDeclaration* indexerDeclaration)
  472. {
  473. Visit(indexerDeclaration->ToBase());
  474. }
  475. void BfStructuralVisitor::Visit(BfFieldDeclaration* fieldDeclaration)
  476. {
  477. Visit(fieldDeclaration->ToBase());
  478. }
  479. void BfStructuralVisitor::Visit(BfEnumCaseDeclaration* enumCaseDeclaration)
  480. {
  481. Visit(enumCaseDeclaration->ToBase());
  482. }
  483. void BfStructuralVisitor::Visit(BfFieldDtorDeclaration* fieldDtorDeclaration)
  484. {
  485. Visit(fieldDtorDeclaration->ToBase());
  486. }
  487. void BfStructuralVisitor::Visit(BfTypeDeclaration* typeDeclaration)
  488. {
  489. Visit(typeDeclaration->ToBase());
  490. }
  491. void BfStructuralVisitor::Visit(BfTypeAliasDeclaration* typeDeclaration)
  492. {
  493. Visit(typeDeclaration->ToBase());
  494. }
  495. void BfStructuralVisitor::Visit(BfUsingDirective* usingDirective)
  496. {
  497. Visit(usingDirective->ToBase());
  498. }
  499. void BfStructuralVisitor::Visit(BfUsingStaticDirective * usingDirective)
  500. {
  501. Visit(usingDirective->ToBase());
  502. }
  503. void BfStructuralVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
  504. {
  505. Visit(namespaceDeclaration->ToBase());
  506. }
  507. void BfStructuralVisitor::Visit(BfBlock* block)
  508. {
  509. Visit(block->ToBase());
  510. }
  511. void BfStructuralVisitor::Visit(BfBlockExtension* block)
  512. {
  513. BF_ASSERT("Shouldn't see this block, BfBlock::Iterator not being used?");
  514. }
  515. void BfStructuralVisitor::Visit(BfRootNode* rootNode)
  516. {
  517. Visit(rootNode->ToBase());
  518. }
  519. void BfStructuralVisitor::Visit(BfInlineAsmStatement* asmStmt)
  520. {
  521. Visit(asmStmt->ToBase());
  522. }
  523. void BfStructuralVisitor::Visit(BfInlineAsmInstruction* asmInst)
  524. {
  525. Visit(asmInst->ToBase());
  526. }
  527. //////////////////////////////////////////////////////////////////////////
  528. static Array<BfAstTypeInfo*> gTypes;
  529. static Array<BfAstAcceptFunc> gAcceptFuncs;
  530. static int sTypeCount;
  531. BfAstTypeInfo::BfAstTypeInfo(const char* name, BfAstTypeInfo* baseType, BfAstAcceptFunc acceptFunc)
  532. {
  533. mName = name;
  534. mBaseType = baseType;
  535. mAcceptFunc = acceptFunc;
  536. if (mBaseType != NULL)
  537. {
  538. mBaseType->mDerivedTypes.Add(this);
  539. }
  540. sTypeCount++;
  541. #ifdef _DEBUG
  542. auto checkBase = mBaseType;
  543. while (checkBase != NULL)
  544. {
  545. if (checkBase == &BfAstNode::sTypeInfo)
  546. break;
  547. checkBase = checkBase->mBaseType;
  548. }
  549. #endif
  550. }
  551. static void AddTypeInfo(BfAstTypeInfo* typeInfo)
  552. {
  553. BF_ASSERT(typeInfo->mTypeId == 0);
  554. typeInfo->mTypeId = (uint8)gTypes.size();
  555. gTypes.Add(typeInfo);
  556. gAcceptFuncs.Add(typeInfo->mAcceptFunc);
  557. for (auto derivedType : typeInfo->mDerivedTypes)
  558. AddTypeInfo(derivedType);
  559. typeInfo->mFullDerivedCount = (uint8)(gTypes.size() - typeInfo->mTypeId - 1);
  560. }
  561. void BfAstTypeInfo::Init()
  562. {
  563. if (!gTypes.IsEmpty())
  564. return;
  565. gTypes.Add(NULL);
  566. gAcceptFuncs.Add(NULL);
  567. AddTypeInfo(&BfAstNode::sTypeInfo);
  568. }
  569. BfIdentifierNode* Beefy::BfIdentifierCast(BfAstNode* node)
  570. {
  571. if (node == NULL)
  572. return NULL;
  573. if (node->GetTypeId() == BfAttributedIdentifierNode::sTypeInfo.mTypeId)
  574. return ((BfAttributedIdentifierNode*)node)->mIdentifier;
  575. bool canCast = (uint)node->GetTypeId() - (uint)BfIdentifierNode::sTypeInfo.mTypeId <= (uint)BfIdentifierNode::sTypeInfo.mFullDerivedCount;
  576. return canCast ? (BfIdentifierNode*)node : NULL;
  577. }
  578. BfAstNode* Beefy::BfNodeToNonTemporary(BfAstNode* node)
  579. {
  580. if (node == NULL)
  581. return NULL;
  582. if (node->GetTypeId() == BfNamedTypeReference::sTypeInfo.mTypeId)
  583. {
  584. auto namedTypeRef = (BfNamedTypeReference*)node;
  585. if (namedTypeRef->IsTemporary())
  586. return BfNodeToNonTemporary(namedTypeRef->mNameNode);
  587. return namedTypeRef;
  588. }
  589. if (!node->IsTemporary())
  590. return node;
  591. return NULL;
  592. }
  593. //////////////////////////////////////////////////////////////////////////
  594. bool BfAstNode::IsMissingSemicolon()
  595. {
  596. if (auto deferStmt = BfNodeDynCast<BfDeferStatement>(this))
  597. return BfNodeDynCastExact<BfBlock>(deferStmt->mTargetNode) == NULL;
  598. if (auto stmt = BfNodeDynCast<BfStatement>(this))
  599. return stmt->mTrailingSemicolon == NULL;
  600. return false;
  601. }
  602. bool BfAstNode::IsExpression()
  603. {
  604. if (auto deferStmt = BfNodeDynCast<BfDeferStatement>(this))
  605. return BfNodeDynCastExact<BfBlock>(deferStmt->mTargetNode) == NULL;
  606. if (auto block = BfNodeDynCast<BfBlock>(this))
  607. {
  608. if (block->mChildArr.mSize == 0)
  609. return false;
  610. return block->mChildArr.GetLast()->IsExpression();
  611. }
  612. return IsA<BfExpression>();
  613. }
  614. bool BfAstNode::LocationEquals(BfAstNode* otherNode)
  615. {
  616. return (GetSourceData() == otherNode->GetSourceData()) &&
  617. (GetSrcStart() == otherNode->GetSrcStart()) &&
  618. (GetSrcEnd() == otherNode->GetSrcEnd());
  619. }
  620. bool BfAstNode::LocationEndEquals(BfAstNode* otherNode)
  621. {
  622. return (GetSourceData() == otherNode->GetSourceData()) &&
  623. (GetSrcEnd() == otherNode->GetSrcEnd());
  624. }
  625. void BfAstNode::Add(BfAstNode* bfAstNode)
  626. {
  627. #ifdef BF_AST_HAS_PARENT_MEMBER
  628. BF_ASSERT(bfAstNode->mParent == NULL);
  629. bfAstNode->mParent = this;
  630. #endif
  631. if (!IsInitialized())
  632. {
  633. int childTriviaStart;
  634. int childSrcStart;
  635. int childSrcEnd;
  636. bfAstNode->GetSrcPositions(childTriviaStart, childSrcStart, childSrcEnd);
  637. Init(childTriviaStart, childSrcStart, childSrcEnd);
  638. return;
  639. }
  640. #ifdef BF_AST_COMPACT
  641. int childTriviaStart;
  642. int childSrcStart;
  643. int childSrcEnd;
  644. bfAstNode->GetSrcPositions(childTriviaStart, childSrcStart, childSrcEnd);
  645. int prevTriviaStart;
  646. int prevSrcStart;
  647. int prevSrcEnd;
  648. GetSrcPositions(prevTriviaStart, prevSrcStart, prevSrcEnd);
  649. if (childTriviaStart < prevTriviaStart)
  650. SetTriviaStart(childTriviaStart);
  651. if (childSrcStart < prevSrcStart)
  652. SetSrcStart(childSrcStart);
  653. if (childSrcEnd > prevSrcEnd)
  654. SetSrcEnd(childSrcEnd);
  655. #else
  656. BF_ASSERT(mSrcStart >= 0);
  657. BF_ASSERT(bfAstNode->mSrcStart >= 0);
  658. mSrcStart = BF_MIN(mSrcStart, bfAstNode->mSrcStart);
  659. mSrcEnd = BF_MAX(mSrcEnd, bfAstNode->mSrcEnd);
  660. #endif
  661. }
  662. #ifdef BF_AST_COMPACT
  663. BfAstInfo* BfAstNode::AllocAstInfo()
  664. {
  665. return GetSource()->mAlloc.Alloc<BfAstInfo>();
  666. }
  667. #endif
  668. void BfAstNode::RemoveSelf()
  669. {
  670. //mParent->mChildren.Remove(this);
  671. #ifdef BF_AST_HAS_PARENT_MEMBER
  672. mParent = NULL;
  673. #endif
  674. }
  675. void BfAstNode::DeleteSelf()
  676. {
  677. //if (mParent != NULL)
  678. //mParent->mChildren.Remove(this);
  679. delete this;
  680. }
  681. void BfAstNode::RemoveNextSibling()
  682. {
  683. //mNext->RemoveSelf();
  684. }
  685. void BfAstNode::DeleteNextSibling()
  686. {
  687. //mNext->DeleteSelf();
  688. }
  689. void BfAstNode::Init(BfParser* bfParser)
  690. {
  691. BF_ASSERT(GetSourceData() == bfParser->mSourceData);
  692. Init(bfParser->mTriviaStart, bfParser->mTokenStart, bfParser->mTokenEnd);
  693. }
  694. void BfAstNode::Accept(BfStructuralVisitor* bfVisitor)
  695. {
  696. (*gAcceptFuncs[GetTypeId()])(this, bfVisitor);
  697. }
  698. bool BfAstNode::IsTemporary()
  699. {
  700. #ifdef BF_AST_COMPACT
  701. return (mIsCompact) && (mCompact_SrcStart == 0) && (mCompact_SrcLen == 0);
  702. #else
  703. return (mSrcEnd == 0);
  704. #endif
  705. }
  706. int BfAstNode::GetStartCharId()
  707. {
  708. if (!IsTemporary())
  709. {
  710. auto bfParser = GetSourceData()->ToParserData();
  711. if (bfParser != NULL)
  712. return bfParser->GetCharIdAtIndex(GetSrcStart());
  713. }
  714. return GetSrcStart();
  715. }
  716. BfSourceData* BfAstNode::GetSourceData()
  717. {
  718. #ifdef BF_AST_ALLOCATOR_USE_PAGES
  719. //BF_ASSERT((intptr)this > 0x4200000000);
  720. BfAstPageHeader* pageHeader = (BfAstPageHeader*)((intptr)this & ~(BfAstAllocManager::PAGE_SIZE - 1));
  721. return pageHeader->mSourceData;
  722. #else
  723. return mSourceData;
  724. #endif
  725. }
  726. BfParser* BfAstNode::GetParser()
  727. {
  728. BfSourceData* sourceData = GetSourceData();
  729. if (sourceData == NULL)
  730. return NULL;
  731. return sourceData->ToParser();
  732. }
  733. bool BfAstNode::IsFromParser(BfParser* parser)
  734. {
  735. if (parser == NULL)
  736. return false;
  737. if (IsTemporary())
  738. return false;
  739. BfSourceData* sourceData = GetSourceData();
  740. if (sourceData == NULL)
  741. return false;
  742. return parser == sourceData->ToParser();
  743. }
  744. String BfAstNode::ToString()
  745. {
  746. int srcLen = GetSrcLength();
  747. if (srcLen <= 0)
  748. {
  749. if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
  750. return namedTypeRef->mNameNode->ToString();
  751. return "";
  752. }
  753. auto source = GetSourceData();
  754. String str(source->mSrc + GetSrcStart(), srcLen);
  755. return str;
  756. }
  757. StringView BfAstNode::ToStringView()
  758. {
  759. int srcLen = GetSrcLength();
  760. if (srcLen <= 0)
  761. {
  762. if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
  763. return namedTypeRef->mNameNode->ToStringView();
  764. return StringView();
  765. }
  766. auto source = GetSourceData();
  767. return StringView(source->mSrc + GetSrcStart(), srcLen);
  768. }
  769. void BfAstNode::ToString(StringImpl& str)
  770. {
  771. int srcLen = GetSrcLength();
  772. if (srcLen <= 0)
  773. {
  774. if (auto namedTypeRef = BfNodeDynCast<BfNamedTypeReference>(this))
  775. namedTypeRef->mNameNode->ToString(str);
  776. return;
  777. }
  778. auto source = GetSourceData();
  779. str.Append(source->mSrc + GetSrcStart(), srcLen);
  780. }
  781. //////////////////////////////////////////////////////////////////////////
  782. void BfBlock::Init(const SizedArrayImpl<BfAstNode*>& vec, BfAstAllocator* alloc)
  783. {
  784. #ifdef BF_USE_NEAR_NODE_REF
  785. int curIdx = 0;
  786. int elemsLeft = (int)vec.size();
  787. BfBlockExtension* curExt = NULL;
  788. while (elemsLeft > 0)
  789. {
  790. int bytesLeft = alloc->GetCurPageBytesLeft();
  791. int useElems = std::min(bytesLeft / (int)sizeof(ASTREF(BfAstNode*)), elemsLeft);
  792. BfBlockExtension* nextExt = NULL;
  793. BfSizedArray<ASTREF(BfAstNode*)>& childArrRef = (curExt != NULL) ? curExt->mChildArr : mChildArr;
  794. childArrRef.mVals = (ASTREF(BfAstNode*)*)alloc->AllocBytes(useElems * sizeof(ASTREF(BfAstNode*)), sizeof(ASTREF(BfAstNode*)));
  795. childArrRef.mSize = useElems;
  796. if (useElems < elemsLeft)
  797. {
  798. nextExt = alloc->Alloc<BfBlockExtension>();
  799. useElems--;
  800. }
  801. for (int i = 0; i < useElems; i++)
  802. childArrRef[i] = vec[curIdx++];
  803. if (nextExt != NULL)
  804. {
  805. childArrRef[useElems] = nextExt;
  806. curExt = nextExt;
  807. }
  808. elemsLeft -= useElems;
  809. }
  810. #else
  811. BfSizedArrayInitIndirect(mChildArr, vec, alloc);
  812. #endif
  813. }
  814. BfAstNode* BfBlock::GetFirst()
  815. {
  816. if (mChildArr.mSize == 0)
  817. return NULL;
  818. return mChildArr.mVals[0];
  819. }
  820. BfAstNode* BfBlock::GetLast()
  821. {
  822. if (mChildArr.mSize == 0)
  823. return NULL;
  824. auto backNode = mChildArr.mVals[mChildArr.mSize - 1];
  825. while (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
  826. backNode = blockExt->mChildArr.GetLast();
  827. return backNode;
  828. }
  829. int BfBlock::GetSize()
  830. {
  831. int size = mChildArr.mSize;
  832. if (mChildArr.mSize == 0)
  833. return size;
  834. BfAstNode* backNode = mChildArr.mVals[mChildArr.mSize - 1];
  835. while (true)
  836. {
  837. if (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
  838. {
  839. size--;
  840. size += blockExt->mChildArr.mSize;
  841. backNode = blockExt->mChildArr.mVals[blockExt->mChildArr.mSize - 1];
  842. }
  843. else
  844. {
  845. break;
  846. }
  847. }
  848. return size;
  849. }
  850. void BfBlock::SetSize(int wantSize)
  851. {
  852. int size = mChildArr.mSize;
  853. if (wantSize == size)
  854. return;
  855. if (wantSize < size)
  856. {
  857. mChildArr.mSize = wantSize;
  858. }
  859. else
  860. {
  861. BfAstNode* backNode = mChildArr.mVals[mChildArr.mSize - 1];
  862. while (true)
  863. {
  864. if (auto blockExt = BfNodeDynCastExact<BfBlockExtension>(backNode))
  865. {
  866. size--;
  867. size += blockExt->mChildArr.mSize;
  868. if (wantSize < size)
  869. {
  870. blockExt->mChildArr.mSize -= (size - wantSize);
  871. break;
  872. }
  873. backNode = blockExt->mChildArr.mVals[blockExt->mChildArr.mSize - 1];
  874. }
  875. else
  876. {
  877. break;
  878. }
  879. }
  880. }
  881. BF_ASSERT(wantSize == GetSize());
  882. }
  883. //////////////////////////////////////////////////////////////////////////
  884. bool BfTypeReference::IsNamedTypeReference()
  885. {
  886. return IsA<BfNamedTypeReference>() || IsA<BfDirectStrTypeReference>();
  887. }
  888. bool BfTypeReference::IsTypeDefTypeReference()
  889. {
  890. return IsA<BfNamedTypeReference>() || IsA<BfDirectStrTypeReference>() || IsA<BfDirectTypeDefReference>();
  891. }
  892. //////////////////////////////////////////////////////////////////////////
  893. BfPropertyMethodDeclaration* BfPropertyDeclaration::GetMethod(const StringImpl& findName)
  894. {
  895. String methodName;
  896. for (auto& methodDeclaration : mMethods)
  897. {
  898. if (methodDeclaration->mNameNode != NULL)
  899. {
  900. methodName.Clear();
  901. methodDeclaration->mNameNode->ToString(methodName);
  902. if (methodName == findName)
  903. return methodDeclaration;
  904. }
  905. }
  906. return NULL;
  907. }
  908. //////////////////////////////////////////////////////////////////////////
  909. bool BfExpression::VerifyIsStatement(BfPassInstance* passInstance, bool ignoreError)
  910. {
  911. if (auto attribExpr = BfNodeDynCast<BfAttributedExpression>(this))
  912. {
  913. return attribExpr->mExpression->VerifyIsStatement(passInstance, ignoreError);
  914. }
  915. if ((!BfNodeIsExact<BfAssignmentExpression>(this)) &&
  916. (!BfNodeIsExact<BfInvocationExpression>(this)) &&
  917. (!BfNodeIsExact<BfObjectCreateExpression>(this)))
  918. {
  919. if (auto castExpr = BfNodeDynCast<BfCastExpression>(this))
  920. {
  921. if ((castExpr->mTypeRef != NULL) && (castExpr->mTypeRef->ToString() == "void"))
  922. {
  923. // Is "(void)variable;" expression, used to remove warning about unused local variables
  924. return false;
  925. }
  926. }
  927. if (!ignoreError)
  928. passInstance->Fail("This expression cannot be used as a statement", this);
  929. //passInstance->Fail("Only assignment, call, increment, decrement, and allocation expressions can be used as a statement", this);
  930. return false;
  931. }
  932. return true;
  933. }
  934. //////////////////////////////////////////////////////////////////////////
  935. bool BfAttributeDirective::Contains(const StringImpl& findName)
  936. {
  937. StringT<128> name;
  938. auto attrDirective = this;
  939. while (attrDirective != NULL)
  940. {
  941. name.clear();
  942. if (attrDirective->mAttributeTypeRef != NULL)
  943. attrDirective->mAttributeTypeRef->ToString(name);
  944. if (findName == name)
  945. return true;
  946. if (name.EndsWith("Attribute"))
  947. {
  948. name.RemoveToEnd(name.length() - 9);
  949. if (findName == name)
  950. return true;
  951. }
  952. attrDirective = attrDirective->mNextAttribute;
  953. }
  954. return false;
  955. }
  956. //////////////////////////////////////////////////////////////////////////
  957. const char* Beefy::BfTokenToString(BfToken token)
  958. {
  959. switch (token)
  960. {
  961. case BfToken_Abstract:
  962. return "abstract";
  963. case BfToken_AlignOf:
  964. return "alignof";
  965. case BfToken_Append:
  966. return "append";
  967. case BfToken_As:
  968. return "as";
  969. case BfToken_Asm:
  970. return "asm";
  971. case BfToken_AsmNewline:
  972. return "\n";
  973. case BfToken_Base:
  974. return "base";
  975. case BfToken_Box:
  976. return "box";
  977. case BfToken_Break:
  978. return "break";
  979. case BfToken_Case:
  980. return "case";
  981. case BfToken_Catch:
  982. return "catch";
  983. case BfToken_Checked:
  984. return "checked";
  985. case BfToken_Class:
  986. return "class";
  987. case BfToken_Concrete:
  988. return "concrete";
  989. case BfToken_Const:
  990. return "const";
  991. case BfToken_Continue:
  992. return "continue";
  993. case BfToken_Decltype:
  994. return "decltype";
  995. case BfToken_Default:
  996. return "default";
  997. case BfToken_Defer:
  998. return "defer";
  999. case BfToken_Delegate:
  1000. return "delegate";
  1001. case BfToken_Delete:
  1002. return "delete";
  1003. case BfToken_Do:
  1004. return "do";
  1005. case BfToken_Else:
  1006. return "else";
  1007. case BfToken_Enum:
  1008. return "enum";
  1009. case BfToken_Explicit:
  1010. return "explicit";
  1011. case BfToken_Extern:
  1012. return "extern";
  1013. case BfToken_Extension:
  1014. return "extension";
  1015. case BfToken_Fallthrough:
  1016. return "fallthrough";
  1017. case BfToken_Finally:
  1018. return "finally";
  1019. case BfToken_Fixed:
  1020. return "fixed";
  1021. case BfToken_For:
  1022. return "for";
  1023. case BfToken_Function:
  1024. return "function";
  1025. case BfToken_Goto:
  1026. return "got";
  1027. case BfToken_If:
  1028. return "if";
  1029. case BfToken_Implicit:
  1030. return "implicit";
  1031. case BfToken_In:
  1032. return "in";
  1033. case BfToken_Interface:
  1034. return "interface";
  1035. case BfToken_Internal:
  1036. return "internal";
  1037. case BfToken_Is:
  1038. return "is";
  1039. case BfToken_Let:
  1040. return "let";
  1041. case BfToken_Mixin:
  1042. return "mixin";
  1043. case BfToken_Mut:
  1044. return "mut";
  1045. case BfToken_Namespace:
  1046. return "namespace";
  1047. case BfToken_New:
  1048. return "new";
  1049. case BfToken_Null:
  1050. return "null";
  1051. case BfToken_Operator:
  1052. return "operator";
  1053. case BfToken_Out:
  1054. return "out";
  1055. case BfToken_Override:
  1056. return "override";
  1057. case BfToken_Params:
  1058. return "params";
  1059. case BfToken_Private:
  1060. return "private";
  1061. case BfToken_Protected:
  1062. return "protected";
  1063. case BfToken_Public:
  1064. return "public";
  1065. case BfToken_ReadOnly:
  1066. return "readonly";
  1067. case BfToken_Repeat:
  1068. return "repeat";
  1069. case BfToken_Ref:
  1070. return "ref";
  1071. case BfToken_RetType:
  1072. return "rettype";
  1073. case BfToken_Return:
  1074. return "return";
  1075. case BfToken_Scope:
  1076. return "scope";
  1077. case BfToken_Sealed:
  1078. return "sealed";
  1079. case BfToken_SizeOf:
  1080. return "sizeof";
  1081. case BfToken_Stack:
  1082. return "stack";
  1083. case BfToken_Static:
  1084. return "static";
  1085. case BfToken_StrideOf:
  1086. return "strideof";
  1087. case BfToken_Struct:
  1088. return "struct";
  1089. case BfToken_Switch:
  1090. return "switch";
  1091. case BfToken_This:
  1092. return "this";
  1093. case BfToken_Throw:
  1094. return "throw";
  1095. case BfToken_Try:
  1096. return "try";
  1097. case BfToken_TypeAlias:
  1098. return "typealias";
  1099. case BfToken_TypeOf:
  1100. return "typeof";
  1101. case BfToken_Unchecked:
  1102. return "unchecked";
  1103. case BfToken_Unsigned:
  1104. return "unsigned";
  1105. case BfToken_Using:
  1106. return "using";
  1107. case BfToken_Var:
  1108. return "var";
  1109. case BfToken_Virtual:
  1110. return "virtual";
  1111. case BfToken_Volatile:
  1112. return "volatile";
  1113. case BfToken_When:
  1114. return "when";
  1115. case BfToken_Where:
  1116. return "where";
  1117. case BfToken_While:
  1118. return "while";
  1119. case BfToken_Yield:
  1120. return "yield";
  1121. case BfToken_AssignEquals:
  1122. return "=";
  1123. case BfToken_CompareEquals:
  1124. return "==";
  1125. case BfToken_CompareNotEquals:
  1126. return "!=";
  1127. case BfToken_LessEquals:
  1128. return "<=";
  1129. case BfToken_GreaterEquals:
  1130. return ">=";
  1131. case BfToken_Spaceship:
  1132. return "<=>";
  1133. case BfToken_PlusEquals:
  1134. return "+=";
  1135. case BfToken_MinusEquals:
  1136. return "-=";
  1137. case BfToken_MultiplyEquals:
  1138. return "*=";
  1139. case BfToken_DivideEquals:
  1140. return "/=";
  1141. case BfToken_ModulusEquals:
  1142. return "%=";
  1143. case BfToken_ShiftLeftEquals:
  1144. return "<<=";
  1145. case BfToken_ShiftRightEquals:
  1146. return ">>=";
  1147. case BfToken_AndEquals:
  1148. return "&=";
  1149. case BfToken_OrEquals:
  1150. return "|=";
  1151. case BfToken_XorEquals:
  1152. return "^=";
  1153. case BfToken_LBrace:
  1154. return "{";
  1155. case BfToken_RBrace:
  1156. return "}";
  1157. case BfToken_LParen:
  1158. return "(";
  1159. case BfToken_RParen:
  1160. return ")";
  1161. case BfToken_LBracket:
  1162. return "[";
  1163. case BfToken_RBracket:
  1164. return "]";
  1165. case BfToken_LChevron:
  1166. return "<";
  1167. case BfToken_RChevron:
  1168. return ">";
  1169. case BfToken_LDblChevron:
  1170. return "<<";
  1171. case BfToken_RDblChevron:
  1172. return ">>";
  1173. case BfToken_Semicolon:
  1174. return ";";
  1175. case BfToken_Colon:
  1176. return ":";
  1177. case BfToken_Comma:
  1178. return ",";
  1179. case BfToken_Dot:
  1180. case BfToken_AutocompleteDot:
  1181. return ".";
  1182. case BfToken_DotDot:
  1183. return "..";
  1184. case BfToken_QuestionDot:
  1185. return "?.";
  1186. case BfToken_QuestionLBracket:
  1187. return "?[";
  1188. case BfToken_Plus:
  1189. return "+";
  1190. case BfToken_Minus:
  1191. return "-";
  1192. case BfToken_DblPlus:
  1193. return "++";
  1194. case BfToken_DblMinus:
  1195. return "--";
  1196. case BfToken_Star:
  1197. return "*";
  1198. case BfToken_ForwardSlash:
  1199. return "/";
  1200. case BfToken_Modulus:
  1201. return "%";
  1202. case BfToken_Ampersand:
  1203. return "&";
  1204. case BfToken_At:
  1205. return "@";
  1206. case BfToken_DblAmpersand:
  1207. return "&&";
  1208. case BfToken_Bar:
  1209. return "|";
  1210. case BfToken_DblBar:
  1211. return "||";
  1212. case BfToken_Bang:
  1213. return "!";
  1214. case BfToken_Carat:
  1215. return "^";
  1216. case BfToken_Tilde:
  1217. return "~";
  1218. case BfToken_Question:
  1219. return "?";
  1220. case BfToken_DblQuestion:
  1221. return "??";
  1222. case BfToken_Arrow:
  1223. return "->";
  1224. case BfToken_FatArrow:
  1225. return "=>";
  1226. default:
  1227. break;
  1228. }
  1229. BF_FATAL("Unknown token");
  1230. return NULL;
  1231. }
  1232. bool Beefy::BfTokenIsKeyword(BfToken token)
  1233. {
  1234. return (token >= BfToken_Abstract) && (token <= BfToken_Yield);
  1235. }
  1236. BfBinaryOp Beefy::BfAssignOpToBinaryOp(BfAssignmentOp assignmentOp)
  1237. {
  1238. switch (assignmentOp)
  1239. {
  1240. case BfAssignmentOp_Add:
  1241. return BfBinaryOp_Add;
  1242. case BfAssignmentOp_Subtract:
  1243. return BfBinaryOp_Subtract;
  1244. case BfAssignmentOp_Multiply:
  1245. return BfBinaryOp_Multiply;
  1246. case BfAssignmentOp_Divide:
  1247. return BfBinaryOp_Divide;
  1248. case BfAssignmentOp_Modulus:
  1249. return BfBinaryOp_Modulus;
  1250. case BfAssignmentOp_ShiftLeft:
  1251. return BfBinaryOp_LeftShift;
  1252. case BfAssignmentOp_ShiftRight:
  1253. return BfBinaryOp_RightShift;
  1254. case BfAssignmentOp_BitwiseAnd:
  1255. return BfBinaryOp_BitwiseAnd;
  1256. case BfAssignmentOp_BitwiseOr:
  1257. return BfBinaryOp_BitwiseOr;
  1258. case BfAssignmentOp_ExclusiveOr:
  1259. return BfBinaryOp_ExclusiveOr;
  1260. default:
  1261. break;
  1262. }
  1263. return BfBinaryOp_None;
  1264. }
  1265. int Beefy::BfGetBinaryOpPrecendence(BfBinaryOp binOp)
  1266. {
  1267. switch (binOp)
  1268. {
  1269. case BfBinaryOp_LeftShift:
  1270. case BfBinaryOp_RightShift:
  1271. return 10;
  1272. case BfBinaryOp_Multiply:
  1273. case BfBinaryOp_Divide:
  1274. case BfBinaryOp_Modulus:
  1275. case BfBinaryOp_BitwiseAnd:
  1276. return 9;
  1277. case BfBinaryOp_Add:
  1278. case BfBinaryOp_Subtract:
  1279. case BfBinaryOp_ExclusiveOr:
  1280. case BfBinaryOp_BitwiseOr:
  1281. return 8;
  1282. // "Range" inserted here if we were copying swift
  1283. case BfBinaryOp_Is:
  1284. case BfBinaryOp_As:
  1285. return 7;
  1286. case BfBinaryOp_Compare:
  1287. return 6;
  1288. case BfBinaryOp_GreaterThan:
  1289. case BfBinaryOp_LessThan:
  1290. case BfBinaryOp_GreaterThanOrEqual:
  1291. case BfBinaryOp_LessThanOrEqual:
  1292. return 5;
  1293. case BfBinaryOp_Equality:
  1294. case BfBinaryOp_InEquality:
  1295. return 4;
  1296. case BfBinaryOp_ConditionalAnd:
  1297. return 3;
  1298. case BfBinaryOp_ConditionalOr:
  1299. return 2;
  1300. case BfBinaryOp_NullCoalesce:
  1301. return 1;
  1302. default:
  1303. break;
  1304. }
  1305. return 0;
  1306. }
  1307. const char* Beefy::BfGetOpName(BfBinaryOp binOp)
  1308. {
  1309. switch (binOp)
  1310. {
  1311. case BfBinaryOp_None: return "";
  1312. case BfBinaryOp_Add: return "+";
  1313. case BfBinaryOp_Subtract: return "-";
  1314. case BfBinaryOp_Multiply: return "*";
  1315. case BfBinaryOp_Divide: return "\\";
  1316. case BfBinaryOp_Modulus: return "%";
  1317. case BfBinaryOp_BitwiseAnd: return "&";
  1318. case BfBinaryOp_BitwiseOr: return "|";
  1319. case BfBinaryOp_ExclusiveOr: return "^";
  1320. case BfBinaryOp_LeftShift: return "<<";
  1321. case BfBinaryOp_RightShift: return ">>";
  1322. case BfBinaryOp_Equality: return "==";
  1323. case BfBinaryOp_InEquality: return "!=";
  1324. case BfBinaryOp_GreaterThan: return ">";
  1325. case BfBinaryOp_LessThan: return "<";
  1326. case BfBinaryOp_GreaterThanOrEqual: return ">=";
  1327. case BfBinaryOp_LessThanOrEqual: return "<=";
  1328. case BfBinaryOp_Compare: return "<=>";
  1329. case BfBinaryOp_ConditionalAnd: return "&&";
  1330. case BfBinaryOp_ConditionalOr: return "||";
  1331. case BfBinaryOp_NullCoalesce: return "&&";
  1332. case BfBinaryOp_Is: return "is";
  1333. case BfBinaryOp_As: return "as";
  1334. default: return "???";
  1335. }
  1336. }
  1337. const char* Beefy::BfGetOpName(BfUnaryOp unaryOp)
  1338. {
  1339. switch (unaryOp)
  1340. {
  1341. case BfUnaryOp_None: return "";
  1342. case BfUnaryOp_AddressOf: return "&";
  1343. case BfUnaryOp_Dereference: return "*";
  1344. case BfUnaryOp_Negate: return "-";
  1345. case BfUnaryOp_Not: return "!";
  1346. case BfUnaryOp_Positive: return "+";
  1347. case BfUnaryOp_InvertBits: return "~";
  1348. case BfUnaryOp_Increment: return "++";
  1349. case BfUnaryOp_Decrement: return "--";
  1350. case BfUnaryOp_PostIncrement: return "++";
  1351. case BfUnaryOp_PostDecrement: return "--";
  1352. case BfUnaryOp_Ref: return "ref";
  1353. case BfUnaryOp_Out: return "out";
  1354. case BfUnaryOp_Mut: return "mut";
  1355. case BfUnaryOp_Params: return "params";
  1356. default: return "???";
  1357. }
  1358. }
  1359. BfInlineAsmInstruction::AsmArg::AsmArg()
  1360. : mType(ARGTYPE_Immediate)
  1361. , mMemFlags(0)
  1362. , mInt(0)
  1363. , mAdjRegScalar(1)
  1364. {}
  1365. #pragma warning(disable:4996)
  1366. String BfInlineAsmInstruction::AsmArg::ToString()
  1367. {
  1368. String s;
  1369. if (!mSizePrefix.empty())
  1370. {
  1371. s += mSizePrefix;
  1372. s += " ptr ";
  1373. }
  1374. if (!mSegPrefix.empty())
  1375. {
  1376. s += mSegPrefix;
  1377. s += ":";
  1378. }
  1379. switch(mType)
  1380. {
  1381. case ARGTYPE_Immediate:
  1382. {
  1383. char buf[64];
  1384. sprintf(buf, "%d", mInt);
  1385. s += buf;
  1386. }
  1387. break;
  1388. case ARGTYPE_FloatReg:
  1389. {
  1390. char buf[64];
  1391. sprintf(buf, "st(%d)", mInt);
  1392. s += buf;
  1393. }
  1394. break;
  1395. case ARGTYPE_IntReg:
  1396. {
  1397. s += mReg;
  1398. }
  1399. break;
  1400. case ARGTYPE_Memory:
  1401. {
  1402. s += "[";
  1403. if (mMemFlags & ARGMEMF_BaseReg)
  1404. {
  1405. s += mReg;
  1406. if (mMemFlags != ARGMEMF_BaseReg)
  1407. s += " + ";
  1408. }
  1409. if (mMemFlags & ARGMEMF_AdjReg)
  1410. {
  1411. s += mAdjReg;
  1412. if (mAdjRegScalar != 1)
  1413. {
  1414. char buf[64];
  1415. sprintf(buf, "%d", mAdjRegScalar);
  1416. s += "*";
  1417. s += buf;
  1418. }
  1419. if (mMemFlags & ARGMEMF_ImmediateDisp)
  1420. s += " + ";
  1421. }
  1422. if (mMemFlags & ARGMEMF_ImmediateDisp)
  1423. {
  1424. char buf[64];
  1425. sprintf(buf, "%d", mInt);
  1426. s += buf;
  1427. }
  1428. s += "]";
  1429. if (!mMemberSuffix.empty())
  1430. {
  1431. s += ".";
  1432. s += mMemberSuffix;
  1433. }
  1434. }
  1435. break;
  1436. }
  1437. return s;
  1438. }
  1439. BfInlineAsmInstruction::AsmInst::AsmInst()
  1440. : mDebugLine(0)
  1441. {}
  1442. String BfInlineAsmInstruction::AsmInst::ToString()
  1443. {
  1444. String s;
  1445. if (!mLabel.empty())
  1446. {
  1447. s += mLabel;
  1448. s += ": ";
  1449. }
  1450. for (auto const& p : mOpPrefixes)
  1451. {
  1452. s += p;
  1453. s += " ";
  1454. }
  1455. s += mOpCode;
  1456. s += " ";
  1457. for (int i=0; i<(int)mArgs.size(); ++i)
  1458. {
  1459. if (i > 0)
  1460. s += ", ";
  1461. s += mArgs[i].ToString();
  1462. }
  1463. return s;
  1464. }