2
0

BfPrinter.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  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 StateModify
  10. {
  11. public:
  12. bool mExpectingSpace;
  13. int mWantNewLineIdx;
  14. bool mDoingBlockOpen;
  15. bool mDoingBlockClose;
  16. int mWantVirtualIndent;
  17. BfAstNode* mQueuedNode;
  18. public:
  19. StateModify()
  20. {
  21. Clear();
  22. mWantVirtualIndent = 0;
  23. mWantNewLineIdx = 0;
  24. }
  25. void Clear()
  26. {
  27. mExpectingSpace = false;
  28. mDoingBlockOpen = false;
  29. mDoingBlockClose = false;
  30. mQueuedNode = NULL;
  31. }
  32. };
  33. BfSourceData* mSource;
  34. BfParserData* mParser;
  35. BfBlock::Iterator mSidechannelItr;
  36. BfAstNode* mSidechannelNextNode;
  37. BfBlock::Iterator mErrorItr;
  38. BfAstNode* mErrorNextNode;
  39. BfAstNode* mCurBlockMember;
  40. BfTypeDeclaration* mCurTypeDecl;
  41. int mTriviaIdx;
  42. int mCurSrcIdx;
  43. Array<StateModify> mChildNodeQueue;
  44. int mFormatStart;
  45. int mFormatEnd;
  46. StateModify mNextStateModify;
  47. String mOutString;
  48. bool mReformatting;
  49. bool mIgnoreTrivia;
  50. bool mDocPrep;
  51. int mCurIndentLevel;
  52. int mQueuedSpaceCount;
  53. int mLastSpaceOffset; // Indent difference from original to new
  54. bool mExpectingNewLine;
  55. bool mIsFirstStatementInBlock;
  56. bool mForceUseTrivia;
  57. bool mInSideChannel;
  58. int mStateModifyVirtualIndentLevel;
  59. int mVirtualIndentLevel;
  60. int mVirtualNewLineIdx;
  61. Array<int>* mCharMapping;
  62. int mHighestCharId;
  63. public:
  64. BfPrinter(BfRootNode* rootNode, BfRootNode* sidechannelRootNode, BfRootNode* errorRootNode);
  65. public:
  66. bool CheckReplace(BfAstNode* astNode);
  67. void FlushIndent();
  68. void Write(const StringImpl& str);
  69. void Write(BfAstNode* node, int start, int len);
  70. void WriteSourceString(BfAstNode* node);
  71. void QueueVisitChild(BfAstNode* astNode);
  72. void QueueVisitErrorNodes(BfRootNode* astNode);
  73. void FlushVisitChild();
  74. void VisitChildWithPrecedingSpace(BfAstNode* bfAstNode);
  75. void VisitChildWithProceedingSpace(BfAstNode* bfAstNode);
  76. void ExpectSpace();
  77. void ExpectNewLine();
  78. void ExpectIndent();
  79. void ExpectUnindent();
  80. void VisitChildNextLine(BfAstNode* node);
  81. void DoBlockOpen(BfBlock* block, bool queue, bool* outDoInlineBlock);
  82. void DoBlockClose(BfBlock* block, bool queue, bool doInlineBlock);
  83. void QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration);
  84. int CalcOrigLineSpacing(BfAstNode* bfAstNode, int* lineStartIdx);
  85. void WriteIgnoredNode(BfAstNode* node);
  86. virtual void Visit(BfAstNode* bfAstNode) override;
  87. virtual void Visit(BfErrorNode* bfErrorNode) override;
  88. virtual void Visit(BfExpression* expr) override;
  89. virtual void Visit(BfExpressionStatement* exprStmt) override;
  90. virtual void Visit(BfAttributedExpression* attribExpr) override;
  91. virtual void Visit(BfStatement* stmt) override;
  92. virtual void Visit(BfLabelableStatement* labelableStmt) override;
  93. virtual void Visit(BfCommentNode* commentNode) override;
  94. virtual void Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection) override;
  95. virtual void Visit(BfPreprocessorNode* preprocessorNode) override;
  96. virtual void Visit(BfAttributeDirective* attributeDirective) override;
  97. virtual void Visit(BfGenericParamsDeclaration* genericParams) override;
  98. virtual void Visit(BfGenericConstraintsDeclaration* genericConstraints) override;
  99. virtual void Visit(BfGenericArgumentsNode* genericArgumentsNode) override;
  100. virtual void Visit(BfEmptyStatement* emptyStmt) override;
  101. virtual void Visit(BfTokenNode* tokenNode) override;
  102. virtual void Visit(BfLiteralExpression* literalExpr) override;
  103. virtual void Visit(BfIdentifierNode* identifierNode) override;
  104. virtual void Visit(BfQualifiedNameNode* nameNode) override;
  105. virtual void Visit(BfThisExpression* thisExpr) override;
  106. virtual void Visit(BfBaseExpression* baseExpr) override;
  107. virtual void Visit(BfMixinExpression* mixinExpr) override;
  108. virtual void Visit(BfSizedArrayCreateExpression* createExpr) override;
  109. virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
  110. virtual void Visit(BfArraySizeSpecifier* arraySizeSpecifier) override;
  111. virtual void Visit(BfTypeReference* typeRef) override;
  112. virtual void Visit(BfNamedTypeReference* typeRef) override;
  113. virtual void Visit(BfQualifiedTypeReference* qualifiedType) override;
  114. virtual void Visit(BfVarTypeReference* typeRef) override;
  115. virtual void Visit(BfLetTypeReference * typeRef) override;
  116. virtual void Visit(BfConstTypeRef* typeRef) override;
  117. virtual void Visit(BfConstExprTypeRef* typeRef) override;
  118. virtual void Visit(BfRefTypeRef* typeRef) override;
  119. virtual void Visit(BfArrayTypeRef* typeRef) override;
  120. virtual void Visit(BfGenericInstanceTypeRef* typeRef) override;
  121. virtual void Visit(BfTupleTypeRef * typeRef) override;
  122. virtual void Visit(BfPointerTypeRef* typeRef) override;
  123. virtual void Visit(BfNullableTypeRef* typeRef) override;
  124. virtual void Visit(BfVariableDeclaration* varDecl) override;
  125. virtual void Visit(BfParameterDeclaration* paramDecl) override;
  126. virtual void Visit(BfParamsExpression* paramsExpr) override;
  127. virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
  128. virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
  129. virtual void Visit(BfDefaultExpression* defaultExpr) override;
  130. virtual void Visit(BfCheckTypeExpression* checkTypeExpr) override;
  131. virtual void Visit(BfDynamicCastExpression* dynCastExpr) override;
  132. virtual void Visit(BfCastExpression* castExpr) override;
  133. virtual void Visit(BfDelegateBindExpression* invocationExpr) override;
  134. virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
  135. virtual void Visit(BfObjectCreateExpression* invocationExpr) override;
  136. virtual void Visit(BfBoxExpression* boxExpr) override;
  137. virtual void Visit(BfInvocationExpression* invocationExpr) override;
  138. virtual void Visit(BfSwitchCase* switchCase) override;
  139. virtual void Visit(BfWhenExpression* whenExpr) override;
  140. virtual void Visit(BfSwitchStatement* switchStmt) override;
  141. virtual void Visit(BfTryStatement* tryStmt) override;
  142. virtual void Visit(BfCatchStatement* catchStmt) override;
  143. virtual void Visit(BfFinallyStatement* finallyStmt) override;
  144. virtual void Visit(BfCheckedStatement* checkedStmt) override;
  145. virtual void Visit(BfUncheckedStatement* uncheckedStmt) override;
  146. virtual void Visit(BfIfStatement* ifStmt) override;
  147. virtual void Visit(BfThrowStatement* throwStmt) override;
  148. virtual void Visit(BfDeleteStatement* deleteStmt) override;
  149. virtual void Visit(BfReturnStatement* returnStmt) override;
  150. virtual void Visit(BfBreakStatement* breakStmt) override;
  151. virtual void Visit(BfContinueStatement* continueStmt) override;
  152. virtual void Visit(BfFallthroughStatement* fallthroughStmt) override;
  153. virtual void Visit(BfUsingStatement* whileStmt) override;
  154. virtual void Visit(BfDoStatement* whileStmt) override;
  155. virtual void Visit(BfRepeatStatement* repeatStmt) override;
  156. virtual void Visit(BfWhileStatement* whileStmt) override;
  157. virtual void Visit(BfForStatement* forStmt) override;
  158. virtual void Visit(BfForEachStatement* forEachStmt) override;
  159. virtual void Visit(BfDeferStatement* deferStmt) override;
  160. virtual void Visit(BfEnumCaseBindExpression * caseBindExpr) override;
  161. virtual void Visit(BfCaseExpression * caseExpr) override;
  162. virtual void Visit(BfConditionalExpression* condExpr) override;
  163. virtual void Visit(BfAssignmentExpression* assignExpr) override;
  164. virtual void Visit(BfParenthesizedExpression* parenExpr) override;
  165. virtual void Visit(BfTupleExpression * tupleExpr) override;
  166. virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
  167. virtual void Visit(BfIndexerExpression* indexerExpr) override;
  168. virtual void Visit(BfUnaryOperatorExpression* binOpExpr) override;
  169. virtual void Visit(BfBinaryOperatorExpression* binOpExpr) override;
  170. virtual void Visit(BfConstructorDeclaration* ctorDeclaration) override;
  171. virtual void Visit(BfDestructorDeclaration* dtorDeclaration) override;
  172. virtual void Visit(BfMethodDeclaration* methodDeclaration) override;
  173. virtual void Visit(BfOperatorDeclaration* opreratorDeclaration) override;
  174. virtual void Visit(BfPropertyMethodDeclaration* propertyDeclaration) override;
  175. virtual void Visit(BfPropertyDeclaration* propertyDeclaration) override;
  176. virtual void Visit(BfFieldDeclaration* fieldDeclaration) override;
  177. virtual void Visit(BfEnumCaseDeclaration* enumCaseDeclaration) override;
  178. virtual void Visit(BfTypeAliasDeclaration* typeDeclaration) override;
  179. virtual void Visit(BfTypeDeclaration* typeDeclaration) override;
  180. virtual void Visit(BfUsingDirective* usingDirective) override;
  181. virtual void Visit(BfUsingStaticDirective* usingDirective) override;
  182. virtual void Visit(BfNamespaceDeclaration* namespaceDeclaration) override;
  183. virtual void Visit(BfBlock* block) override;
  184. virtual void Visit(BfRootNode* rootNode) override;
  185. virtual void Visit(BfInlineAsmStatement* asmStmt) override;
  186. };
  187. NS_BF_END