BfElementVisitor.cpp 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211
  1. #include "BfElementVisitor.h"
  2. USING_NS_BF;
  3. //////////////////////////////////////////////////////////////////////////
  4. BfElementVisitor::BfElementVisitor()
  5. {
  6. }
  7. void BfElementVisitor::Visit(BfTypedValueExpression* typedValueExpr)
  8. {
  9. Visit(typedValueExpr->ToBase());
  10. }
  11. void BfElementVisitor::Visit(BfCommentNode* commentNode)
  12. {
  13. Visit(commentNode->ToBase());
  14. }
  15. void BfElementVisitor::Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection)
  16. {
  17. Visit(preprocesorIgnoredSection->ToBase());
  18. }
  19. void BfElementVisitor::Visit(BfPreprocessorNode* preprocessorNode)
  20. {
  21. Visit(preprocessorNode->ToBase());
  22. VisitChild(preprocessorNode->mCommand);
  23. VisitChild(preprocessorNode->mArgument);
  24. }
  25. void BfElementVisitor::Visit(BfPreprocessorDefinedExpression* definedExpr)
  26. {
  27. Visit(definedExpr->ToBase());
  28. VisitChild(definedExpr->mIdentifier);
  29. }
  30. void BfElementVisitor::Visit(BfAttributeDirective* attributeDirective)
  31. {
  32. Visit(attributeDirective->ToBase());
  33. VisitChild(attributeDirective->mAttrOpenToken); // Either [ or ,
  34. VisitChild(attributeDirective->mAttrCloseToken);
  35. VisitChild(attributeDirective->mAttributeTargetSpecifier);
  36. VisitChild(attributeDirective->mAttributeTypeRef);
  37. VisitChild(attributeDirective->mCtorOpenParen);
  38. VisitChild(attributeDirective->mCtorCloseParen);
  39. for (auto& val : attributeDirective->mArguments)
  40. VisitChild(val);
  41. for (auto& val : attributeDirective->mCommas)
  42. VisitChild(val);
  43. VisitChild(attributeDirective->mNextAttribute);
  44. }
  45. void BfElementVisitor::Visit(BfGenericParamsDeclaration* genericParams)
  46. {
  47. Visit(genericParams->ToBase());
  48. VisitChild(genericParams->mOpenChevron);
  49. for (auto& val : genericParams->mGenericParams)
  50. VisitChild(val);
  51. for (auto& val : genericParams->mCommas)
  52. VisitChild(val);
  53. VisitChild(genericParams->mCloseChevron);
  54. }
  55. void BfElementVisitor::Visit(BfGenericOperatorConstraint* genericConstraints)
  56. {
  57. Visit(genericConstraints->ToBase());
  58. VisitChild(genericConstraints->mOperatorToken);
  59. VisitChild(genericConstraints->mLeftType);
  60. VisitChild(genericConstraints->mOpToken);
  61. VisitChild(genericConstraints->mRightType);
  62. }
  63. void BfElementVisitor::Visit(BfGenericConstraintsDeclaration* genericConstraints)
  64. {
  65. Visit(genericConstraints->ToBase());
  66. for (auto genericConstraint : genericConstraints->mGenericConstraints)
  67. {
  68. VisitChild(genericConstraint->mWhereToken);
  69. VisitChild(genericConstraint->mTypeRef);
  70. VisitChild(genericConstraint->mColonToken);
  71. for (auto val : genericConstraint->mConstraintTypes)
  72. VisitChild(val);
  73. for (auto val : genericConstraint->mCommas)
  74. VisitChild(val);
  75. }
  76. }
  77. void BfElementVisitor::Visit(BfGenericArgumentsNode* genericArgumentsNode)
  78. {
  79. Visit(genericArgumentsNode->ToBase());
  80. VisitChild(genericArgumentsNode->mOpenChevron);
  81. for (auto& val : genericArgumentsNode->mGenericArgs)
  82. VisitChild(val);
  83. for (auto& val : genericArgumentsNode->mCommas)
  84. VisitChild(val);
  85. VisitChild(genericArgumentsNode->mCloseChevron);
  86. }
  87. void BfElementVisitor::Visit(BfStatement* stmt)
  88. {
  89. Visit(stmt->ToBase());
  90. VisitChild(stmt->mTrailingSemicolon);
  91. }
  92. void BfElementVisitor::Visit(BfLabelableStatement* labelableStmt)
  93. {
  94. Visit(labelableStmt->ToBase());
  95. if (labelableStmt->mLabelNode != NULL)
  96. {
  97. VisitChild(labelableStmt->mLabelNode->mLabel);
  98. VisitChild(labelableStmt->mLabelNode->mColonToken);
  99. }
  100. }
  101. void BfElementVisitor::Visit(BfScopeNode* scopeNode)
  102. {
  103. Visit(scopeNode->ToBase());
  104. VisitChild(scopeNode->mScopeToken);
  105. VisitChild(scopeNode->mColonToken);
  106. VisitChild(scopeNode->mTargetNode);
  107. VisitChild(scopeNode->mAttributes);
  108. }
  109. void BfElementVisitor::Visit(BfNewNode* newNode)
  110. {
  111. Visit(newNode->ToBase());
  112. VisitChild(newNode->mNewToken);
  113. VisitChild(newNode->mColonToken);
  114. VisitChild(newNode->mAllocNode);
  115. VisitChild(newNode->mAttributes);
  116. }
  117. void BfElementVisitor::Visit(BfLabeledBlock* labeledBlock)
  118. {
  119. Visit(labeledBlock->ToBase());
  120. VisitChild(labeledBlock->mBlock);
  121. }
  122. void BfElementVisitor::Visit(BfExpression* expr)
  123. {
  124. Visit(expr->ToBase());
  125. }
  126. void BfElementVisitor::Visit(BfExpressionStatement* exprStmt)
  127. {
  128. Visit(exprStmt->ToBase());
  129. VisitChild(exprStmt->mExpression);
  130. }
  131. void BfElementVisitor::Visit(BfAttributedExpression* attribExpr)
  132. {
  133. Visit(attribExpr->ToBase());
  134. VisitChild(attribExpr->mAttributes);
  135. VisitChild(attribExpr->mExpression);
  136. }
  137. void BfElementVisitor::Visit(BfEmptyStatement* emptyStmt)
  138. {
  139. Visit(emptyStmt->ToBase());
  140. }
  141. void BfElementVisitor::Visit(BfTokenNode* tokenNode)
  142. {
  143. Visit(tokenNode->ToBase());
  144. }
  145. void BfElementVisitor::Visit(BfTokenPairNode* tokenPairNode)
  146. {
  147. Visit(tokenPairNode->ToBase());
  148. VisitChild(tokenPairNode->mLeft);
  149. VisitChild(tokenPairNode->mRight);
  150. }
  151. void BfElementVisitor::Visit(BfLiteralExpression* literalExpr)
  152. {
  153. Visit(literalExpr->ToBase());
  154. }
  155. void BfElementVisitor::Visit(BfIdentifierNode* identifierNode)
  156. {
  157. Visit(identifierNode->ToBase());
  158. }
  159. void BfElementVisitor::Visit(BfAttributedIdentifierNode * attrIdentifierNode)
  160. {
  161. Visit(attrIdentifierNode->ToBase());
  162. VisitChild(attrIdentifierNode->mAttributes);
  163. VisitChild(attrIdentifierNode->mIdentifier);
  164. }
  165. void BfElementVisitor::Visit(BfQualifiedNameNode* nameNode)
  166. {
  167. Visit(nameNode->ToBase());
  168. VisitChild(nameNode->mLeft);
  169. VisitChild(nameNode->mDot);
  170. VisitChild(nameNode->mRight);
  171. }
  172. void BfElementVisitor::Visit(BfThisExpression* thisExpr)
  173. {
  174. Visit(thisExpr->ToBase());
  175. }
  176. void BfElementVisitor::Visit(BfBaseExpression* baseExpr)
  177. {
  178. Visit(baseExpr->ToBase());
  179. }
  180. void BfElementVisitor::Visit(BfMixinExpression* mixinExpr)
  181. {
  182. Visit(mixinExpr->ToBase());
  183. }
  184. void BfElementVisitor::Visit(BfSizedArrayCreateExpression* createExpr)
  185. {
  186. Visit(createExpr->ToBase());
  187. VisitChild(createExpr->mTypeRef);
  188. VisitChild(createExpr->mInitializer);
  189. }
  190. void BfElementVisitor::Visit(BfCollectionInitializerExpression* collectionInitExpr)
  191. {
  192. Visit(collectionInitExpr->ToBase());
  193. VisitChild(collectionInitExpr->mOpenBrace);
  194. for (auto& val : collectionInitExpr->mValues)
  195. VisitChild(val);
  196. for (auto& val : collectionInitExpr->mCommas)
  197. VisitChild(val);
  198. VisitChild(collectionInitExpr->mCloseBrace);
  199. }
  200. void BfElementVisitor::Visit(BfArraySizeSpecifier* arraySizeSpecifier)
  201. {
  202. Visit(arraySizeSpecifier->ToBase());
  203. VisitChild(arraySizeSpecifier->mOpenToken);
  204. for (auto& val : arraySizeSpecifier->mArguments)
  205. VisitChild(val);
  206. for (auto& val : arraySizeSpecifier->mCommas)
  207. VisitChild(val);
  208. VisitChild(arraySizeSpecifier->mCloseToken);
  209. }
  210. void BfElementVisitor::Visit(BfTypeReference* typeRef)
  211. {
  212. Visit(typeRef->ToBase());
  213. }
  214. void BfElementVisitor::Visit(BfNamedTypeReference* typeRef)
  215. {
  216. Visit(typeRef->ToBase());
  217. VisitChild(typeRef->mNameNode);
  218. }
  219. void BfElementVisitor::Visit(BfQualifiedTypeReference* qualifiedTypeRef)
  220. {
  221. Visit(qualifiedTypeRef->ToBase());
  222. VisitChild(qualifiedTypeRef->mLeft);
  223. VisitChild(qualifiedTypeRef->mDot);
  224. VisitChild(qualifiedTypeRef->mRight);
  225. }
  226. void BfElementVisitor::Visit(BfDotTypeReference* typeRef)
  227. {
  228. Visit(typeRef->ToBase());
  229. VisitChild(typeRef->mDotToken);
  230. }
  231. void BfElementVisitor::Visit(BfVarTypeReference* typeRef)
  232. {
  233. Visit(typeRef->ToBase());
  234. VisitChild(typeRef->mVarToken);
  235. }
  236. void BfElementVisitor::Visit(BfVarRefTypeReference* typeRef)
  237. {
  238. Visit(typeRef->ToBase());
  239. VisitChild(typeRef->mVarToken);
  240. VisitChild(typeRef->mRefToken);
  241. }
  242. void BfElementVisitor::Visit(BfLetTypeReference* typeRef)
  243. {
  244. Visit(typeRef->ToBase());
  245. VisitChild(typeRef->mLetToken);
  246. }
  247. void BfElementVisitor::Visit(BfConstTypeRef* typeRef)
  248. {
  249. Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
  250. VisitChild(typeRef->mConstToken);
  251. VisitChild(typeRef->mElementType);
  252. }
  253. void BfElementVisitor::Visit(BfConstExprTypeRef* typeRef)
  254. {
  255. Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
  256. VisitChild(typeRef->mConstToken);
  257. VisitChild(typeRef->mConstExpr);
  258. }
  259. void BfElementVisitor::Visit(BfRefTypeRef* typeRef)
  260. {
  261. Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
  262. VisitChild(typeRef->mRefToken);
  263. VisitChild(typeRef->mElementType);
  264. }
  265. void BfElementVisitor::Visit(BfRetTypeTypeRef * typeRef)
  266. {
  267. Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
  268. VisitChild(typeRef->mRetTypeToken);
  269. VisitChild(typeRef->mOpenParen);
  270. VisitChild(typeRef->mElementType);
  271. VisitChild(typeRef->mCloseParen);
  272. }
  273. void BfElementVisitor::Visit(BfArrayTypeRef* typeRef)
  274. {
  275. Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
  276. VisitChild(typeRef->mElementType);
  277. VisitChild(typeRef->mOpenBracket);
  278. for (auto& val : typeRef->mParams)
  279. VisitChild(val);
  280. VisitChild(typeRef->mCloseBracket);
  281. }
  282. void BfElementVisitor::Visit(BfGenericInstanceTypeRef* typeRef)
  283. {
  284. Visit(typeRef->ToBase());
  285. VisitChild(typeRef->mOpenChevron);
  286. for (auto& val : typeRef->mGenericArguments)
  287. VisitChild(val);
  288. if (typeRef->mCommas.mVals != NULL)
  289. {
  290. for (auto& val : typeRef->mCommas)
  291. VisitChild(val);
  292. }
  293. VisitChild(typeRef->mCloseChevron);
  294. }
  295. void BfElementVisitor::Visit(BfTupleTypeRef* typeRef)
  296. {
  297. Visit(typeRef->ToBase());
  298. VisitChild(typeRef->mOpenParen);
  299. for (auto& val : typeRef->mFieldNames)
  300. VisitChild(val);
  301. for (auto& val : typeRef->mFieldTypes)
  302. VisitChild(val);
  303. if (typeRef->mCommas.mVals != NULL)
  304. {
  305. for (auto& val : typeRef->mCommas)
  306. VisitChild(val);
  307. }
  308. VisitChild(typeRef->mCloseParen);
  309. }
  310. void BfElementVisitor::Visit(BfDeclTypeRef* typeRef)
  311. {
  312. Visit(typeRef->ToBase());
  313. VisitChild(typeRef->mToken);
  314. VisitChild(typeRef->mOpenParen);
  315. VisitChild(typeRef->mTarget);
  316. VisitChild(typeRef->mCloseParen);
  317. }
  318. void BfElementVisitor::Visit(BfDelegateTypeRef* typeRef)
  319. {
  320. Visit((BfTypeReference*)typeRef);
  321. VisitChild(typeRef->mTypeToken);
  322. VisitChild(typeRef->mReturnType);
  323. VisitChild(typeRef->mAttributes);
  324. VisitChild(typeRef->mOpenParen);
  325. for (auto& param : typeRef->mParams)
  326. VisitChild(param);
  327. for (auto& comma : typeRef->mCommas)
  328. VisitChild(comma);
  329. VisitChild(typeRef->mCloseParen);
  330. }
  331. void BfElementVisitor::Visit(BfPointerTypeRef* typeRef)
  332. {
  333. Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
  334. VisitChild(typeRef->mElementType);
  335. VisitChild(typeRef->mStarNode);
  336. }
  337. void BfElementVisitor::Visit(BfNullableTypeRef* typeRef)
  338. {
  339. Visit((BfTypeReference*)typeRef); // Skip the Elemented part so we can put the element in the right spot
  340. VisitChild(typeRef->mElementType);
  341. VisitChild(typeRef->mQuestionToken);
  342. }
  343. void BfElementVisitor::Visit(BfVariableDeclaration* varDecl)
  344. {
  345. Visit(varDecl->ToBase());
  346. VisitChild(varDecl->mAttributes);
  347. VisitChild(varDecl->mModSpecifier);
  348. VisitChild(varDecl->mTypeRef);
  349. VisitChild(varDecl->mPrecedingComma);
  350. VisitChild(varDecl->mNameNode); // Either BfIdentifierNode or BfTupleExpression
  351. VisitChild(varDecl->mEqualsNode);
  352. VisitChild(varDecl->mInitializer);
  353. }
  354. void BfElementVisitor::Visit(BfLocalMethodDeclaration* methodDecl)
  355. {
  356. Visit(methodDecl->ToBase());
  357. VisitChild(methodDecl->mMethodDeclaration);
  358. }
  359. void BfElementVisitor::Visit(BfParameterDeclaration* paramDecl)
  360. {
  361. Visit(paramDecl->ToBase());
  362. VisitChild(paramDecl->mModToken); // 'Params'
  363. }
  364. void BfElementVisitor::Visit(BfParamsExpression* paramsExpr)
  365. {
  366. Visit(paramsExpr->ToBase());
  367. VisitChild(paramsExpr->mParamsToken);
  368. }
  369. void BfElementVisitor::Visit(BfTypeAttrExpression* typeAttrExpr)
  370. {
  371. Visit(typeAttrExpr->ToBase());
  372. VisitChild(typeAttrExpr->mToken);
  373. VisitChild(typeAttrExpr->mOpenParen);
  374. VisitChild(typeAttrExpr->mTypeRef);
  375. VisitChild(typeAttrExpr->mCloseParen);
  376. }
  377. void BfElementVisitor::Visit(BfDefaultExpression* defaultExpr)
  378. {
  379. Visit(defaultExpr->ToBase());
  380. VisitChild(defaultExpr->mDefaultToken);
  381. VisitChild(defaultExpr->mOpenParen);
  382. VisitChild(defaultExpr->mTypeRef);
  383. VisitChild(defaultExpr->mCloseParen);
  384. }
  385. void BfElementVisitor::Visit(BfUninitializedExpression* uninitializedExpr)
  386. {
  387. Visit(uninitializedExpr->ToBase());
  388. VisitChild(uninitializedExpr->mQuestionToken);
  389. }
  390. void BfElementVisitor::Visit(BfCheckTypeExpression* checkTypeExpr)
  391. {
  392. Visit(checkTypeExpr->ToBase());
  393. VisitChild(checkTypeExpr->mTarget);
  394. VisitChild(checkTypeExpr->mIsToken);
  395. VisitChild(checkTypeExpr->mTypeRef);
  396. }
  397. void BfElementVisitor::Visit(BfDynamicCastExpression* dynCastExpr)
  398. {
  399. Visit(dynCastExpr->ToBase());
  400. VisitChild(dynCastExpr->mTarget);
  401. VisitChild(dynCastExpr->mAsToken);
  402. VisitChild(dynCastExpr->mTypeRef);
  403. }
  404. void BfElementVisitor::Visit(BfCastExpression* castExpr)
  405. {
  406. Visit(castExpr->ToBase());
  407. VisitChild(castExpr->mOpenParen);
  408. VisitChild(castExpr->mTypeRef);
  409. VisitChild(castExpr->mCloseParen);
  410. }
  411. void BfElementVisitor::Visit(BfDelegateBindExpression* bindExpr)
  412. {
  413. Visit(bindExpr->ToBase());
  414. VisitChild(bindExpr->mNewToken);
  415. VisitChild(bindExpr->mFatArrowToken);
  416. VisitChild(bindExpr->mTarget);
  417. VisitChild(bindExpr->mGenericArgs);
  418. }
  419. void BfElementVisitor::Visit(BfLambdaBindExpression* lambdaBindExpr)
  420. {
  421. Visit(lambdaBindExpr->ToBase());
  422. VisitChild(lambdaBindExpr->mNewToken);
  423. VisitChild(lambdaBindExpr->mOpenParen);
  424. VisitChild(lambdaBindExpr->mCloseParen);
  425. for (auto& val : lambdaBindExpr->mParams)
  426. VisitChild(val);
  427. for (auto& val : lambdaBindExpr->mCommas)
  428. VisitChild(val);
  429. VisitChild(lambdaBindExpr->mFatArrowToken);
  430. VisitChild(lambdaBindExpr->mBody); // Either expression or block
  431. VisitChild(lambdaBindExpr->mDtor);
  432. }
  433. void BfElementVisitor::Visit(BfObjectCreateExpression* newExpr)
  434. {
  435. Visit(newExpr->ToBase());
  436. VisitChild(newExpr->mNewNode);
  437. VisitChild(newExpr->mStarToken);
  438. VisitChild(newExpr->mTypeRef);
  439. VisitChild(newExpr->mOpenToken);
  440. VisitChild(newExpr->mCloseToken);
  441. for (auto& val : newExpr->mArguments)
  442. VisitChild(val);
  443. for (auto& val : newExpr->mCommas)
  444. VisitChild(val);
  445. }
  446. void BfElementVisitor::Visit(BfBoxExpression* boxExpr)
  447. {
  448. Visit(boxExpr->ToBase());
  449. VisitChild(boxExpr->mAllocNode);
  450. VisitChild(boxExpr->mBoxToken);
  451. VisitChild(boxExpr->mExpression);
  452. }
  453. void BfElementVisitor::Visit(BfScopedInvocationTarget* scopedTarget)
  454. {
  455. Visit(scopedTarget->ToBase());
  456. VisitChild(scopedTarget->mTarget);
  457. VisitChild(scopedTarget->mColonToken);
  458. VisitChild(scopedTarget->mScopeName);
  459. }
  460. void BfElementVisitor::Visit(BfThrowStatement* throwStmt)
  461. {
  462. Visit(throwStmt->ToBase());
  463. VisitChild(throwStmt->mThrowToken);
  464. VisitChild(throwStmt->mExpression);
  465. }
  466. void BfElementVisitor::Visit(BfDeleteStatement* deleteStmt)
  467. {
  468. Visit(deleteStmt->ToBase());
  469. VisitChild(deleteStmt->mDeleteToken);
  470. VisitChild(deleteStmt->mTargetTypeToken);
  471. VisitChild(deleteStmt->mAllocExpr);
  472. VisitChild(deleteStmt->mExpression);
  473. }
  474. void BfElementVisitor::Visit(BfInvocationExpression* invocationExpr)
  475. {
  476. Visit(invocationExpr->ToBase());
  477. VisitChild(invocationExpr->mTarget);
  478. VisitChild(invocationExpr->mOpenParen);
  479. VisitChild(invocationExpr->mCloseParen);
  480. VisitChild(invocationExpr->mGenericArgs);
  481. for (auto& val : invocationExpr->mArguments)
  482. VisitChild(val);
  483. for (auto& val : invocationExpr->mCommas)
  484. VisitChild(val);
  485. }
  486. void BfElementVisitor::Visit(BfEnumCaseBindExpression* caseBindExpr)
  487. {
  488. Visit(caseBindExpr->ToBase());
  489. VisitChild(caseBindExpr->mBindToken);
  490. VisitChild(caseBindExpr->mEnumMemberExpr);
  491. VisitChild(caseBindExpr->mBindNames);
  492. }
  493. void BfElementVisitor::Visit(BfCaseExpression* caseExpr)
  494. {
  495. Visit(caseExpr->ToBase());
  496. VisitChild(caseExpr->mCaseToken);
  497. VisitChild(caseExpr->mCaseExpression);
  498. VisitChild(caseExpr->mEqualsNode);
  499. VisitChild(caseExpr->mValueExpression);
  500. }
  501. void BfElementVisitor::Visit(BfSwitchCase* switchCase)
  502. {
  503. Visit(switchCase->ToBase());
  504. VisitChild(switchCase->mCaseToken);
  505. for (auto& val : switchCase->mCaseExpressions)
  506. VisitChild(val);
  507. for (auto& val : switchCase->mCaseCommas)
  508. VisitChild(val);
  509. VisitChild(switchCase->mColonToken);
  510. VisitChild(switchCase->mCodeBlock);
  511. VisitChild(switchCase->mEndingToken);
  512. VisitChild(switchCase->mEndingSemicolonToken);
  513. }
  514. void BfElementVisitor::Visit(BfWhenExpression* whenExpr)
  515. {
  516. Visit(whenExpr->ToBase());
  517. VisitChild(whenExpr->mWhenToken);
  518. VisitChild(whenExpr->mExpression);
  519. }
  520. void BfElementVisitor::Visit(BfSwitchStatement* switchStmt)
  521. {
  522. Visit(switchStmt->ToBase());
  523. VisitChild(switchStmt->mSwitchToken);
  524. VisitChild(switchStmt->mOpenParen);
  525. VisitChild(switchStmt->mSwitchValue);
  526. VisitChild(switchStmt->mCloseParen);
  527. VisitChild(switchStmt->mOpenBrace);
  528. for (auto& val : switchStmt->mSwitchCases)
  529. VisitChild(val);
  530. VisitChild(switchStmt->mDefaultCase);
  531. VisitChild(switchStmt->mCloseBrace);
  532. }
  533. void BfElementVisitor::Visit(BfTryStatement* tryStmt)
  534. {
  535. Visit(tryStmt->ToBase());
  536. VisitChild(tryStmt->mTryToken);
  537. VisitChild(tryStmt->mStatement);
  538. }
  539. void BfElementVisitor::Visit(BfCatchStatement* catchStmt)
  540. {
  541. Visit(catchStmt->ToBase());
  542. VisitChild(catchStmt->mCatchToken);
  543. VisitChild(catchStmt->mStatement);
  544. }
  545. void BfElementVisitor::Visit(BfFinallyStatement* finallyStmt)
  546. {
  547. Visit(finallyStmt->ToBase());
  548. VisitChild(finallyStmt->mFinallyToken);
  549. VisitChild(finallyStmt->mStatement);
  550. }
  551. void BfElementVisitor::Visit(BfCheckedStatement* checkedStmt)
  552. {
  553. Visit(checkedStmt->ToBase());
  554. VisitChild(checkedStmt->mCheckedToken);
  555. VisitChild(checkedStmt->mStatement);
  556. }
  557. void BfElementVisitor::Visit(BfUncheckedStatement* uncheckedStmt)
  558. {
  559. Visit(uncheckedStmt->ToBase());
  560. VisitChild(uncheckedStmt->mUncheckedToken);
  561. VisitChild(uncheckedStmt->mStatement);
  562. }
  563. void BfElementVisitor::Visit(BfIfStatement* ifStmt)
  564. {
  565. Visit(ifStmt->ToBase());
  566. VisitChild(ifStmt->mIfToken);
  567. VisitChild(ifStmt->mOpenParen);
  568. VisitChild(ifStmt->mCondition);
  569. VisitChild(ifStmt->mCloseParen);
  570. VisitChild(ifStmt->mTrueStatement);
  571. VisitChild(ifStmt->mElseToken);
  572. VisitChild(ifStmt->mFalseStatement);
  573. }
  574. void BfElementVisitor::Visit(BfDeferStatement* deferStmt)
  575. {
  576. Visit(deferStmt->ToBase());
  577. VisitChild(deferStmt->mDeferToken);
  578. VisitChild(deferStmt->mColonToken);
  579. VisitChild(deferStmt->mScopeName);
  580. if (deferStmt->mBind != NULL)
  581. {
  582. auto bind = deferStmt->mBind;
  583. VisitChild(bind->mOpenBracket);
  584. VisitChild(bind->mCloseBracket);
  585. for (auto& val : bind->mParams)
  586. VisitChild(val);
  587. for (auto& val : bind->mCommas)
  588. VisitChild(val);
  589. }
  590. VisitChild(deferStmt->mOpenParen);
  591. VisitChild(deferStmt->mScopeToken);
  592. VisitChild(deferStmt->mCloseParen);
  593. VisitChild(deferStmt->mTargetNode);
  594. }
  595. void BfElementVisitor::Visit(BfReturnStatement* returnStmt)
  596. {
  597. Visit(returnStmt->ToBase());
  598. VisitChild(returnStmt->mReturnToken);
  599. VisitChild(returnStmt->mExpression);
  600. }
  601. void BfElementVisitor::Visit(BfYieldStatement* yieldStmt)
  602. {
  603. Visit(yieldStmt->ToBase());
  604. VisitChild(yieldStmt->mReturnOrBreakToken);
  605. VisitChild(yieldStmt->mExpression);
  606. }
  607. void BfElementVisitor::Visit(BfUsingStatement* usingStmt)
  608. {
  609. Visit(usingStmt->ToBase());
  610. VisitChild(usingStmt->mUsingToken);
  611. VisitChild(usingStmt->mOpenParen);
  612. VisitChild(usingStmt->mVariableDeclaration);
  613. VisitChild(usingStmt->mCloseParen);
  614. VisitChild(usingStmt->mEmbeddedStatement);
  615. }
  616. void BfElementVisitor::Visit(BfDoStatement* doStmt)
  617. {
  618. Visit(doStmt->ToBase());
  619. VisitChild(doStmt->mDoToken);
  620. VisitChild(doStmt->mEmbeddedStatement);
  621. }
  622. void BfElementVisitor::Visit(BfRepeatStatement* repeatStmt)
  623. {
  624. Visit(repeatStmt->ToBase());
  625. VisitChild(repeatStmt->mRepeatToken);
  626. VisitChild(repeatStmt->mEmbeddedStatement);
  627. VisitChild(repeatStmt->mWhileToken);
  628. VisitChild(repeatStmt->mOpenParen);
  629. VisitChild(repeatStmt->mCondition);
  630. VisitChild(repeatStmt->mCloseParen);
  631. }
  632. void BfElementVisitor::Visit(BfWhileStatement* whileStmt)
  633. {
  634. Visit(whileStmt->ToBase());
  635. VisitChild(whileStmt->mWhileToken);
  636. VisitChild(whileStmt->mOpenParen);
  637. VisitChild(whileStmt->mCondition);
  638. VisitChild(whileStmt->mCloseParen);
  639. VisitChild(whileStmt->mEmbeddedStatement);
  640. }
  641. void BfElementVisitor::Visit(BfBreakStatement* breakStmt)
  642. {
  643. Visit(breakStmt->ToBase());
  644. VisitChild(breakStmt->mBreakNode);
  645. VisitChild(breakStmt->mLabel);
  646. }
  647. void BfElementVisitor::Visit(BfContinueStatement* continueStmt)
  648. {
  649. Visit(continueStmt->ToBase());
  650. VisitChild(continueStmt->mContinueNode);
  651. VisitChild(continueStmt->mLabel);
  652. }
  653. void BfElementVisitor::Visit(BfFallthroughStatement* fallthroughStmt)
  654. {
  655. Visit(fallthroughStmt->ToBase());
  656. VisitChild(fallthroughStmt->mFallthroughToken);
  657. }
  658. void BfElementVisitor::Visit(BfForStatement* forStmt)
  659. {
  660. Visit(forStmt->ToBase());
  661. VisitChild(forStmt->mForToken);
  662. VisitChild(forStmt->mOpenParen);
  663. for (auto& val : forStmt->mInitializers)
  664. VisitChild(val);
  665. for (auto& val : forStmt->mInitializerCommas)
  666. VisitChild(val);
  667. VisitChild(forStmt->mInitializerSemicolon);
  668. VisitChild(forStmt->mCondition);
  669. VisitChild(forStmt->mConditionSemicolon);
  670. for (auto& val : forStmt->mIterators)
  671. VisitChild(val);
  672. for (auto& val : forStmt->mIteratorCommas)
  673. VisitChild(val);
  674. VisitChild(forStmt->mCloseParen);
  675. VisitChild(forStmt->mEmbeddedStatement);
  676. }
  677. void BfElementVisitor::Visit(BfForEachStatement* forEachStmt)
  678. {
  679. Visit(forEachStmt->ToBase());
  680. VisitChild(forEachStmt->mForToken);
  681. VisitChild(forEachStmt->mOpenParen);
  682. VisitChild(forEachStmt->mReadOnlyToken);
  683. VisitChild(forEachStmt->mVariableTypeRef);
  684. VisitChild(forEachStmt->mVariableName);
  685. VisitChild(forEachStmt->mInToken);
  686. VisitChild(forEachStmt->mCollectionExpression);
  687. VisitChild(forEachStmt->mCloseParen);
  688. VisitChild(forEachStmt->mEmbeddedStatement);
  689. }
  690. void BfElementVisitor::Visit(BfConditionalExpression* condExpr)
  691. {
  692. Visit(condExpr->ToBase());
  693. VisitChild(condExpr->mConditionExpression);
  694. VisitChild(condExpr->mQuestionToken);
  695. VisitChild(condExpr->mTrueExpression);
  696. VisitChild(condExpr->mColonToken);
  697. VisitChild(condExpr->mFalseExpression);
  698. }
  699. void BfElementVisitor::Visit(BfAssignmentExpression* assignExpr)
  700. {
  701. Visit(assignExpr->ToBase());
  702. VisitChild(assignExpr->mOpToken);
  703. VisitChild(assignExpr->mLeft);
  704. VisitChild(assignExpr->mRight);
  705. }
  706. void BfElementVisitor::Visit(BfParenthesizedExpression* parenExpr)
  707. {
  708. Visit(parenExpr->ToBase());
  709. VisitChild(parenExpr->mOpenParen);
  710. VisitChild(parenExpr->mExpression);
  711. VisitChild(parenExpr->mCloseParen);
  712. }
  713. void BfElementVisitor::Visit(BfTupleExpression* tupleExpr)
  714. {
  715. Visit(tupleExpr->ToBase());
  716. VisitChild(tupleExpr->mOpenParen);
  717. for (auto& val : tupleExpr->mNames)
  718. {
  719. if (val != NULL)
  720. {
  721. VisitChild(val->mNameNode);
  722. VisitChild(val->mColonToken);
  723. }
  724. }
  725. for (auto& val : tupleExpr->mValues)
  726. VisitChild(val);
  727. for (auto& val : tupleExpr->mCommas)
  728. VisitChild(val);
  729. VisitChild(tupleExpr->mCloseParen);
  730. }
  731. void BfElementVisitor::Visit(BfMemberReferenceExpression* memberRefExpr)
  732. {
  733. Visit(memberRefExpr->ToBase());
  734. VisitChild(memberRefExpr->mDotToken);
  735. VisitChild(memberRefExpr->mTarget);
  736. VisitChild(memberRefExpr->mMemberName);
  737. }
  738. void BfElementVisitor::Visit(BfIndexerExpression* indexerExpr)
  739. {
  740. Visit(indexerExpr->ToBase());
  741. VisitChild(indexerExpr->mTarget);
  742. VisitChild(indexerExpr->mOpenBracket);
  743. VisitChild(indexerExpr->mCloseBracket);
  744. for (auto& arg : indexerExpr->mArguments)
  745. VisitChild(arg);
  746. for (auto& comma : indexerExpr->mCommas)
  747. VisitChild(comma);
  748. }
  749. void BfElementVisitor::Visit(BfUnaryOperatorExpression* binOpExpr)
  750. {
  751. Visit(binOpExpr->ToBase());
  752. VisitChild(binOpExpr->mOpToken);
  753. VisitChild(binOpExpr->mExpression);
  754. }
  755. void BfElementVisitor::Visit(BfBinaryOperatorExpression* binOpExpr)
  756. {
  757. Visit(binOpExpr->ToBase());
  758. VisitChild(binOpExpr->mOpToken);
  759. VisitChild(binOpExpr->mLeft);
  760. VisitChild(binOpExpr->mRight);
  761. }
  762. void BfElementVisitor::Visit(BfConstructorDeclaration* ctorDeclaration)
  763. {
  764. Visit(ctorDeclaration->ToBase());
  765. VisitChild(ctorDeclaration->mThisToken);
  766. VisitChild(ctorDeclaration->mInitializerColonToken);
  767. VisitChild(ctorDeclaration->mInitializer);
  768. }
  769. void BfElementVisitor::Visit(BfDestructorDeclaration* dtorDeclaration)
  770. {
  771. Visit(dtorDeclaration->ToBase());
  772. VisitChild(dtorDeclaration->mTildeToken);
  773. VisitChild(dtorDeclaration->mThisToken);
  774. }
  775. void BfElementVisitor::Visit(BfMethodDeclaration* methodDeclaration)
  776. {
  777. Visit(methodDeclaration->ToBase());
  778. VisitChild(methodDeclaration->mAttributes);
  779. VisitChild(methodDeclaration->mInternalSpecifier);
  780. VisitChild(methodDeclaration->mProtectionSpecifier);
  781. VisitChild(methodDeclaration->mReadOnlySpecifier);
  782. VisitChild(methodDeclaration->mStaticSpecifier);
  783. VisitChild(methodDeclaration->mReturnAttributes);
  784. VisitChild(methodDeclaration->mExternSpecifier);
  785. VisitChild(methodDeclaration->mVirtualSpecifier); // either 'virtual', 'override', or 'abstract'
  786. VisitChild(methodDeclaration->mNewSpecifier);
  787. VisitChild(methodDeclaration->mMixinSpecifier);
  788. VisitChild(methodDeclaration->mPartialSpecifier);
  789. VisitChild(methodDeclaration->mMutSpecifier);
  790. VisitChild(methodDeclaration->mReturnType);
  791. VisitChild(methodDeclaration->mExplicitInterface);
  792. VisitChild(methodDeclaration->mExplicitInterfaceDotToken);
  793. VisitChild(methodDeclaration->mNameNode);
  794. VisitChild(methodDeclaration->mOpenParen);
  795. for (auto& param : methodDeclaration->mParams)
  796. VisitChild(param);
  797. for (auto& comma : methodDeclaration->mCommas)
  798. VisitChild(comma);
  799. VisitChild(methodDeclaration->mCloseParen);
  800. VisitChild(methodDeclaration->mGenericParams);
  801. VisitChild(methodDeclaration->mGenericConstraintsDeclaration);
  802. VisitChild(methodDeclaration->mEndSemicolon);
  803. VisitChild(methodDeclaration->mFatArrowToken);
  804. VisitChild(methodDeclaration->mBody);
  805. }
  806. void BfElementVisitor::Visit(BfOperatorDeclaration* operatorDeclaration)
  807. {
  808. Visit(operatorDeclaration->ToBase());
  809. VisitChild(operatorDeclaration->mExplicitToken);
  810. VisitChild(operatorDeclaration->mOperatorToken);
  811. VisitChild(operatorDeclaration->mOpTypeToken);
  812. }
  813. void BfElementVisitor::Visit(BfPropertyMethodDeclaration* propertyDeclaration)
  814. {
  815. Visit(propertyDeclaration->ToBase());
  816. VisitChild(propertyDeclaration->mAttributes);
  817. VisitChild(propertyDeclaration->mProtectionSpecifier);
  818. VisitChild(propertyDeclaration->mNameNode);
  819. VisitChild(propertyDeclaration->mMutSpecifier);
  820. VisitChild(propertyDeclaration->mBody);
  821. }
  822. void BfElementVisitor::Visit(BfPropertyBodyExpression* propertyBodyExpression)
  823. {
  824. Visit(propertyBodyExpression->ToBase());
  825. VisitChild(propertyBodyExpression->mFatTokenArrow);
  826. }
  827. void BfElementVisitor::Visit(BfPropertyDeclaration* propertyDeclaration)
  828. {
  829. Visit(propertyDeclaration->ToBase());
  830. VisitChild(propertyDeclaration->mAttributes);
  831. VisitChild(propertyDeclaration->mInternalSpecifier);
  832. VisitChild(propertyDeclaration->mProtectionSpecifier);
  833. VisitChild(propertyDeclaration->mStaticSpecifier);
  834. VisitChild(propertyDeclaration->mVirtualSpecifier); // either 'virtual', 'override', or 'abstract'
  835. VisitChild(propertyDeclaration->mExplicitInterface);
  836. VisitChild(propertyDeclaration->mExplicitInterfaceDotToken);
  837. if (auto block = BfNodeDynCast<BfBlock>(propertyDeclaration->mDefinitionBlock))
  838. {
  839. VisitChild(block->mOpenBrace);
  840. for (auto& method : propertyDeclaration->mMethods)
  841. VisitChild(method);
  842. VisitChild(block->mCloseBrace);
  843. }
  844. else
  845. {
  846. VisitChild(propertyDeclaration->mDefinitionBlock);
  847. for (auto& method : propertyDeclaration->mMethods)
  848. VisitChild(method);
  849. }
  850. }
  851. void BfElementVisitor::Visit(BfIndexerDeclaration* indexerDeclaration)
  852. {
  853. Visit(indexerDeclaration->ToBase());
  854. VisitChild(indexerDeclaration->mThisToken);
  855. VisitChild(indexerDeclaration->mOpenBracket);
  856. for (auto& param : indexerDeclaration->mParams)
  857. VisitChild(param);
  858. for (auto& comma : indexerDeclaration->mCommas)
  859. VisitChild(comma);
  860. VisitChild(indexerDeclaration->mCloseBracket);
  861. }
  862. void BfElementVisitor::Visit(BfFieldDeclaration* fieldDeclaration)
  863. {
  864. Visit(fieldDeclaration->ToBase());
  865. VisitChild(fieldDeclaration->mAttributes);
  866. VisitChild(fieldDeclaration->mInternalSpecifier);
  867. VisitChild(fieldDeclaration->mProtectionSpecifier);
  868. VisitChild(fieldDeclaration->mStaticSpecifier);
  869. VisitChild(fieldDeclaration->mPrecedingComma);
  870. VisitChild(fieldDeclaration->mConstSpecifier);
  871. VisitChild(fieldDeclaration->mReadOnlySpecifier);
  872. VisitChild(fieldDeclaration->mVolatileSpecifier);
  873. VisitChild(fieldDeclaration->mNewSpecifier);
  874. VisitChild(fieldDeclaration->mExternSpecifier);
  875. VisitChild(fieldDeclaration->mTypeRef);
  876. VisitChild(fieldDeclaration->mNameNode);
  877. VisitChild(fieldDeclaration->mEqualsNode);
  878. VisitChild(fieldDeclaration->mInitializer);
  879. VisitChild(fieldDeclaration->mFieldDtor);
  880. }
  881. void BfElementVisitor::Visit(BfEnumCaseDeclaration* enumCaseDeclaration)
  882. {
  883. Visit(enumCaseDeclaration->ToBase());
  884. VisitChild(enumCaseDeclaration->mCaseToken);
  885. for (auto& entry : enumCaseDeclaration->mEntries)
  886. VisitChild(entry);
  887. for (auto& comma : enumCaseDeclaration->mCommas)
  888. VisitChild(comma);
  889. }
  890. void BfElementVisitor::Visit(BfFieldDtorDeclaration* fieldDtorDeclaration)
  891. {
  892. Visit(fieldDtorDeclaration->ToBase());
  893. VisitChild(fieldDtorDeclaration->mTildeToken);
  894. VisitChild(fieldDtorDeclaration->mBody);
  895. VisitChild(fieldDtorDeclaration->mNextFieldDtor);
  896. }
  897. void BfElementVisitor::Visit(BfTypeDeclaration* typeDeclaration)
  898. {
  899. Visit(typeDeclaration->ToBase());
  900. VisitChild(typeDeclaration->mAttributes);
  901. VisitChild(typeDeclaration->mAbstractSpecifier);
  902. VisitChild(typeDeclaration->mSealedSpecifier);
  903. VisitChild(typeDeclaration->mInternalSpecifier);
  904. VisitChild(typeDeclaration->mProtectionSpecifier);
  905. VisitChild(typeDeclaration->mStaticSpecifier);
  906. VisitChild(typeDeclaration->mPartialSpecifier);
  907. VisitChild(typeDeclaration->mTypeNode);
  908. VisitChild(typeDeclaration->mNameNode);
  909. VisitChild(typeDeclaration->mColonToken);
  910. for (auto& baseClass : typeDeclaration->mBaseClasses)
  911. VisitChild(baseClass);
  912. for (auto& comma : typeDeclaration->mBaseClassCommas)
  913. VisitChild(comma);
  914. VisitChild(typeDeclaration->mGenericParams);
  915. VisitChild(typeDeclaration->mGenericConstraintsDeclaration);
  916. VisitChild(typeDeclaration->mDefineNode);
  917. /*if (typeDeclaration->mDefineBlock != NULL)
  918. {
  919. for (auto& member : *typeDeclaration->mDefineBlock)
  920. VisitChild(member);
  921. }*/
  922. }
  923. void BfElementVisitor::Visit(BfTypeAliasDeclaration* typeDeclaration)
  924. {
  925. Visit(typeDeclaration->ToBase());
  926. VisitChild(typeDeclaration->mEqualsToken);
  927. VisitChild(typeDeclaration->mAliasToType);
  928. VisitChild(typeDeclaration->mEndSemicolon);
  929. }
  930. void BfElementVisitor::Visit(BfUsingDirective* usingDirective)
  931. {
  932. Visit(usingDirective->ToBase());
  933. VisitChild(usingDirective->mUsingToken);
  934. VisitChild(usingDirective->mNamespace);
  935. }
  936. void BfElementVisitor::Visit(BfUsingStaticDirective * usingDirective)
  937. {
  938. Visit(usingDirective->ToBase());
  939. VisitChild(usingDirective->mUsingToken);
  940. VisitChild(usingDirective->mStaticToken);
  941. VisitChild(usingDirective->mTypeRef);
  942. }
  943. void BfElementVisitor::Visit(BfNamespaceDeclaration* namespaceDeclaration)
  944. {
  945. Visit(namespaceDeclaration->ToBase());
  946. VisitChild(namespaceDeclaration->mNamespaceNode);
  947. VisitChild(namespaceDeclaration->mNameNode);
  948. VisitChild(namespaceDeclaration->mBlock);
  949. }
  950. void BfElementVisitor::Visit(BfBlock* block)
  951. {
  952. Visit(block->ToBase());
  953. VisitChild(block->mOpenBrace);
  954. VisitMembers(block);
  955. VisitChild(block->mCloseBrace);
  956. }
  957. void BfElementVisitor::Visit(BfRootNode* rootNode)
  958. {
  959. Visit(rootNode->ToBase());
  960. VisitMembers(rootNode);
  961. }
  962. void BfElementVisitor::Visit(BfInlineAsmStatement* asmStmt)
  963. {
  964. Visit(asmStmt->ToBase());
  965. }
  966. void BfElementVisitor::Visit(BfInlineAsmInstruction* asmInst)
  967. {
  968. Visit(asmInst->ToBase());
  969. }