BfPrinter.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #include "BeefySysLib/Common.h"
  2. //#include "llvm/Support/raw_ostream.h"
  3. #include "BfAst.h"
  4. #include "BfElementVisitor.h"
  5. NS_BF_BEGIN
  6. class BfPrinter : public BfElementVisitor
  7. {
  8. public:
  9. struct BlockState
  10. {
  11. int mLastSpaceOffset;
  12. bool mDoInlineBlock;
  13. bool mIsCompact;
  14. int mIndentStart;
  15. BlockState()
  16. {
  17. mLastSpaceOffset = 0;
  18. mDoInlineBlock = false;
  19. mIsCompact = false;
  20. mIndentStart = 0;
  21. }
  22. };
  23. struct StateModify
  24. {
  25. public:
  26. bool mExpectingSpace;
  27. int mWantNewLineIdx;
  28. bool mDoingBlockOpen;
  29. bool mDoingBlockClose;
  30. int mWantVirtualIndent;
  31. BfAstNode* mQueuedNode;
  32. public:
  33. StateModify()
  34. {
  35. Clear();
  36. mWantVirtualIndent = 0;
  37. mWantNewLineIdx = 0;
  38. }
  39. void Clear()
  40. {
  41. mExpectingSpace = false;
  42. mDoingBlockOpen = false;
  43. mDoingBlockClose = false;
  44. mQueuedNode = NULL;
  45. }
  46. };
  47. struct ChildQueueState
  48. {
  49. Array<StateModify>* mQueue;
  50. int mIdx;
  51. ChildQueueState()
  52. {
  53. mQueue = NULL;
  54. mIdx = 0;
  55. }
  56. };
  57. BfSourceData* mSource;
  58. BfParserData* mParser;
  59. BfBlock::Iterator mSidechannelItr;
  60. BfAstNode* mSidechannelNextNode;
  61. BfBlock::Iterator mErrorItr;
  62. BfAstNode* mErrorNextNode;
  63. BfAstNode* mCurBlockMember;
  64. BfTypeDeclaration* mCurTypeDecl;
  65. int mTriviaIdx;
  66. int mCurSrcIdx;
  67. Array<ChildQueueState*> mActiveChildQueues;
  68. Array<StateModify> mChildNodeQueue;
  69. int mFormatStart;
  70. int mFormatEnd;
  71. int mFormatDisableCount;
  72. StateModify mNextStateModify;
  73. String mOutString;
  74. bool mReformatting;
  75. bool mIgnoreTrivia;
  76. bool mDocPrep;
  77. BlockState* mCurBlockState;
  78. int mCurIndentLevel;
  79. int mQueuedSpaceCount;
  80. int mLastSpaceOffset; // Indent difference from original to new
  81. bool mExpectingNewLine;
  82. int mCurCol;
  83. int mMaxCol;
  84. int mTabSize;
  85. bool mWantsTabsAsSpaces;
  86. bool mIndentCaseLabels;
  87. bool mIsFirstStatementInBlock;
  88. bool mForceUseTrivia;
  89. bool mInSideChannel;
  90. int mStateModifyVirtualIndentLevel;
  91. int mVirtualIndentLevel;
  92. int mVirtualNewLineIdx;
  93. Array<int>* mCharMapping;
  94. int mHighestCharId;
  95. public:
  96. BfPrinter(BfRootNode* rootNode, BfRootNode* sidechannelRootNode, BfRootNode* errorRootNode);
  97. public:
  98. void Update(BfAstNode* bfAstNode);
  99. bool CheckReplace(BfAstNode* astNode);
  100. void FlushIndent();
  101. void Write(const StringView& str);
  102. void Write(BfAstNode* node, int start, int len);
  103. void WriteSourceString(BfAstNode* node);
  104. void QueueVisitChild(BfAstNode* astNode);
  105. void QueueVisitErrorNodes(BfRootNode* astNode);
  106. void FlushVisitChild();
  107. void VisitChildWithPrecedingSpace(BfAstNode* bfAstNode);
  108. void VisitChildWithProceedingSpace(BfAstNode* bfAstNode);
  109. void ExpectSpace();
  110. void ExpectNewLine();
  111. void ExpectIndent();
  112. void ExpectUnindent();
  113. void VisitChildNextLine(BfAstNode* node);
  114. void DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState);
  115. void DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState);
  116. void HandleBlock(BfBlock* block, bool isCompact = false);
  117. void QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration);
  118. int CalcOrigLineSpacing(BfAstNode* bfAstNode, int* lineStartIdx);
  119. void WriteIgnoredNode(BfAstNode* node);
  120. void CheckRawNode(BfAstNode* node);
  121. virtual void Visit(BfAstNode* bfAstNode) override;
  122. virtual void Visit(BfErrorNode* bfErrorNode) override;
  123. virtual void Visit(BfScopeNode * scopeNode) override;
  124. virtual void Visit(BfNewNode * newNode) override;
  125. virtual void Visit(BfExpression* expr) override;
  126. virtual void Visit(BfExpressionStatement* exprStmt) override;
  127. virtual void Visit(BfNamedExpression* namedExpr) override;
  128. virtual void Visit(BfAttributedExpression* attribExpr) override;
  129. virtual void Visit(BfStatement* stmt) override;
  130. virtual void Visit(BfLabelableStatement* labelableStmt) override;
  131. virtual void Visit(BfCommentNode* commentNode) override;
  132. virtual void Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection) override;
  133. virtual void Visit(BfPreprocessorNode* preprocessorNode) override;
  134. virtual void Visit(BfAttributeDirective* attributeDirective) override;
  135. virtual void Visit(BfGenericParamsDeclaration* genericParams) override;
  136. virtual void Visit(BfGenericOperatorConstraint* genericConstraints) override;
  137. virtual void Visit(BfGenericConstraintsDeclaration* genericConstraints) override;
  138. virtual void Visit(BfGenericArgumentsNode* genericArgumentsNode) override;
  139. virtual void Visit(BfEmptyStatement* emptyStmt) override;
  140. virtual void Visit(BfTokenNode* tokenNode) override;
  141. virtual void Visit(BfTokenPairNode* tokenPairNode) override;
  142. virtual void Visit(BfUsingSpecifierNode* usingSpecifier) override;
  143. virtual void Visit(BfLiteralExpression* literalExpr) override;
  144. virtual void Visit(BfStringInterpolationExpression* stringInterpolationExpression) override;
  145. virtual void Visit(BfIdentifierNode* identifierNode) override;
  146. virtual void Visit(BfQualifiedNameNode* nameNode) override;
  147. virtual void Visit(BfThisExpression* thisExpr) override;
  148. virtual void Visit(BfBaseExpression* baseExpr) override;
  149. virtual void Visit(BfMixinExpression* mixinExpr) override;
  150. virtual void Visit(BfSizedArrayCreateExpression* createExpr) override;
  151. virtual void Visit(BfInitializerExpression* initExpr) override;
  152. virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
  153. virtual void Visit(BfTypeReference* typeRef) override;
  154. virtual void Visit(BfNamedTypeReference* typeRef) override;
  155. virtual void Visit(BfQualifiedTypeReference* qualifiedType) override;
  156. virtual void Visit(BfVarTypeReference* typeRef) override;
  157. virtual void Visit(BfLetTypeReference * typeRef) override;
  158. virtual void Visit(BfConstTypeRef* typeRef) override;
  159. virtual void Visit(BfConstExprTypeRef* typeRef) override;
  160. virtual void Visit(BfRefTypeRef* typeRef) override;
  161. virtual void Visit(BfArrayTypeRef* typeRef) override;
  162. virtual void Visit(BfGenericInstanceTypeRef* typeRef) override;
  163. virtual void Visit(BfTupleTypeRef * typeRef) override;
  164. virtual void Visit(BfTagTypeRef* typeRef) override;
  165. virtual void Visit(BfDelegateTypeRef* typeRef) override;
  166. virtual void Visit(BfPointerTypeRef* typeRef) override;
  167. virtual void Visit(BfNullableTypeRef* typeRef) override;
  168. virtual void Visit(BfInlineTypeReference* typeRef) override;
  169. virtual void Visit(BfVariableDeclaration* varDecl) override;
  170. virtual void Visit(BfParameterDeclaration* paramDecl) override;
  171. virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
  172. virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
  173. virtual void Visit(BfOffsetOfExpression* offsetOfExpr) override;
  174. virtual void Visit(BfDefaultExpression* defaultExpr) override;
  175. virtual void Visit(BfIsConstExpression* isConstExpr) override;
  176. virtual void Visit(BfCheckTypeExpression* checkTypeExpr) override;
  177. virtual void Visit(BfDynamicCastExpression* dynCastExpr) override;
  178. virtual void Visit(BfCastExpression* castExpr) override;
  179. virtual void Visit(BfDelegateBindExpression* invocationExpr) override;
  180. virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
  181. virtual void Visit(BfObjectCreateExpression* invocationExpr) override;
  182. virtual void Visit(BfBoxExpression* boxExpr) override;
  183. virtual void Visit(BfInvocationExpression* invocationExpr) override;
  184. virtual void Visit(BfSwitchCase* switchCase) override;
  185. virtual void Visit(BfWhenExpression* whenExpr) override;
  186. virtual void Visit(BfSwitchStatement* switchStmt) override;
  187. virtual void Visit(BfTryStatement* tryStmt) override;
  188. virtual void Visit(BfCatchStatement* catchStmt) override;
  189. virtual void Visit(BfFinallyStatement* finallyStmt) override;
  190. virtual void Visit(BfCheckedStatement* checkedStmt) override;
  191. virtual void Visit(BfUncheckedStatement* uncheckedStmt) override;
  192. virtual void Visit(BfIfStatement* ifStmt) override;
  193. virtual void Visit(BfThrowStatement* throwStmt) override;
  194. virtual void Visit(BfDeleteStatement* deleteStmt) override;
  195. virtual void Visit(BfReturnStatement* returnStmt) override;
  196. virtual void Visit(BfBreakStatement* breakStmt) override;
  197. virtual void Visit(BfContinueStatement* continueStmt) override;
  198. virtual void Visit(BfFallthroughStatement* fallthroughStmt) override;
  199. virtual void Visit(BfUsingStatement* whileStmt) override;
  200. virtual void Visit(BfDoStatement* whileStmt) override;
  201. virtual void Visit(BfRepeatStatement* repeatStmt) override;
  202. virtual void Visit(BfWhileStatement* whileStmt) override;
  203. virtual void Visit(BfForStatement* forStmt) override;
  204. virtual void Visit(BfForEachStatement* forEachStmt) override;
  205. virtual void Visit(BfDeferStatement* deferStmt) override;
  206. virtual void Visit(BfEnumCaseBindExpression * caseBindExpr) override;
  207. virtual void Visit(BfCaseExpression * caseExpr) override;
  208. virtual void Visit(BfConditionalExpression* condExpr) override;
  209. virtual void Visit(BfAssignmentExpression* assignExpr) override;
  210. virtual void Visit(BfParenthesizedExpression* parenExpr) override;
  211. virtual void Visit(BfTupleExpression * tupleExpr) override;
  212. virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
  213. virtual void Visit(BfIndexerExpression* indexerExpr) override;
  214. virtual void Visit(BfUnaryOperatorExpression* binOpExpr) override;
  215. virtual void Visit(BfBinaryOperatorExpression* binOpExpr) override;
  216. virtual void Visit(BfConstructorDeclaration* ctorDeclaration) override;
  217. virtual void Visit(BfAutoConstructorDeclaration* ctorDeclaration) override;
  218. virtual void Visit(BfDestructorDeclaration* dtorDeclaration) override;
  219. virtual void Visit(BfMethodDeclaration* methodDeclaration) override;
  220. virtual void Visit(BfOperatorDeclaration* opreratorDeclaration) override;
  221. virtual void Visit(BfPropertyMethodDeclaration* propertyDeclaration) override;
  222. virtual void Visit(BfPropertyBodyExpression* propertyBodyExpression) override;
  223. virtual void Visit(BfPropertyDeclaration* propertyDeclaration) override;
  224. virtual void Visit(BfIndexerDeclaration* indexerDeclaration) override;
  225. virtual void Visit(BfFieldDeclaration* fieldDeclaration) override;
  226. virtual void Visit(BfEnumCaseDeclaration* enumCaseDeclaration) override;
  227. virtual void Visit(BfTypeAliasDeclaration* typeDeclaration) override;
  228. virtual void Visit(BfFieldDtorDeclaration* fieldDtorDeclaration) override;
  229. virtual void Visit(BfTypeDeclaration* typeDeclaration) override;
  230. virtual void Visit(BfUsingDirective* usingDirective) override;
  231. virtual void Visit(BfUsingModDirective* usingDirective) override;
  232. virtual void Visit(BfNamespaceDeclaration* namespaceDeclaration) override;
  233. virtual void Visit(BfBlock* block) override;
  234. virtual void Visit(BfRootNode* rootNode) override;
  235. virtual void Visit(BfInlineAsmStatement* asmStmt) override;
  236. };
  237. NS_BF_END