BfAst.cpp 39 KB

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