2019-08-23 11:56:54 -07:00
|
|
|
#include "BeefySysLib/Common.h"
|
|
|
|
//#include "llvm/Support/raw_ostream.h"
|
|
|
|
#include "BfAst.h"
|
|
|
|
#include "BfElementVisitor.h"
|
|
|
|
|
|
|
|
NS_BF_BEGIN
|
|
|
|
|
|
|
|
class BfPrinter : public BfElementVisitor
|
|
|
|
{
|
|
|
|
public:
|
2020-09-30 07:39:39 -07:00
|
|
|
struct BlockState
|
|
|
|
{
|
|
|
|
int mLastSpaceOffset;
|
|
|
|
bool mDoInlineBlock;
|
|
|
|
int mIndentStart;
|
|
|
|
|
|
|
|
BlockState()
|
|
|
|
{
|
|
|
|
mLastSpaceOffset = 0;
|
|
|
|
mDoInlineBlock = false;
|
|
|
|
mIndentStart = 0;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-08-23 11:56:54 -07:00
|
|
|
struct StateModify
|
|
|
|
{
|
|
|
|
public:
|
2022-07-26 13:27:03 -04:00
|
|
|
bool mExpectingSpace;
|
2019-08-23 11:56:54 -07:00
|
|
|
int mWantNewLineIdx;
|
|
|
|
bool mDoingBlockOpen;
|
2022-07-26 13:27:03 -04:00
|
|
|
bool mDoingBlockClose;
|
2019-08-23 11:56:54 -07:00
|
|
|
int mWantVirtualIndent;
|
|
|
|
BfAstNode* mQueuedNode;
|
|
|
|
|
|
|
|
public:
|
|
|
|
StateModify()
|
|
|
|
{
|
|
|
|
Clear();
|
|
|
|
mWantVirtualIndent = 0;
|
|
|
|
mWantNewLineIdx = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Clear()
|
|
|
|
{
|
2022-07-26 13:27:03 -04:00
|
|
|
mExpectingSpace = false;
|
2019-08-23 11:56:54 -07:00
|
|
|
mDoingBlockOpen = false;
|
|
|
|
mDoingBlockClose = false;
|
|
|
|
mQueuedNode = NULL;
|
|
|
|
}
|
|
|
|
};
|
2022-07-26 13:27:03 -04:00
|
|
|
|
2025-05-19 07:57:55 +02:00
|
|
|
struct ChildQueueState
|
|
|
|
{
|
|
|
|
Array<StateModify>* mQueue;
|
|
|
|
int mIdx;
|
|
|
|
|
|
|
|
ChildQueueState()
|
|
|
|
{
|
|
|
|
mQueue = NULL;
|
|
|
|
mIdx = 0;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-08-23 11:56:54 -07:00
|
|
|
BfSourceData* mSource;
|
|
|
|
BfParserData* mParser;
|
|
|
|
|
|
|
|
BfBlock::Iterator mSidechannelItr;
|
2022-07-26 13:27:03 -04:00
|
|
|
BfAstNode* mSidechannelNextNode;
|
2019-08-23 11:56:54 -07:00
|
|
|
|
|
|
|
BfBlock::Iterator mErrorItr;
|
|
|
|
BfAstNode* mErrorNextNode;
|
|
|
|
BfAstNode* mCurBlockMember;
|
|
|
|
BfTypeDeclaration* mCurTypeDecl;
|
|
|
|
|
|
|
|
int mTriviaIdx;
|
|
|
|
int mCurSrcIdx;
|
2025-05-19 07:57:55 +02:00
|
|
|
Array<ChildQueueState*> mActiveChildQueues;
|
2019-08-23 11:56:54 -07:00
|
|
|
Array<StateModify> mChildNodeQueue;
|
|
|
|
int mFormatStart;
|
2022-07-26 13:27:03 -04:00
|
|
|
int mFormatEnd;
|
2022-05-24 06:20:35 -07:00
|
|
|
int mFormatDisableCount;
|
2019-08-23 11:56:54 -07:00
|
|
|
StateModify mNextStateModify;
|
2022-07-26 13:27:03 -04:00
|
|
|
|
2019-08-23 11:56:54 -07:00
|
|
|
String mOutString;
|
2022-07-26 13:27:03 -04:00
|
|
|
bool mReformatting;
|
2019-08-23 11:56:54 -07:00
|
|
|
bool mIgnoreTrivia;
|
|
|
|
bool mDocPrep;
|
2020-12-28 09:10:49 -08:00
|
|
|
BlockState* mCurBlockState;
|
2019-08-23 11:56:54 -07:00
|
|
|
int mCurIndentLevel;
|
|
|
|
int mQueuedSpaceCount;
|
2022-07-26 13:27:03 -04:00
|
|
|
int mLastSpaceOffset; // Indent difference from original to new
|
2019-08-23 11:56:54 -07:00
|
|
|
bool mExpectingNewLine;
|
2020-03-28 14:26:14 -07:00
|
|
|
int mCurCol;
|
|
|
|
int mMaxCol;
|
2022-05-16 11:01:30 -07:00
|
|
|
int mTabSize;
|
|
|
|
bool mWantsTabsAsSpaces;
|
|
|
|
bool mIndentCaseLabels;
|
2019-08-23 11:56:54 -07:00
|
|
|
|
|
|
|
bool mIsFirstStatementInBlock;
|
|
|
|
bool mForceUseTrivia;
|
2022-07-26 13:27:03 -04:00
|
|
|
bool mInSideChannel;
|
2019-08-23 11:56:54 -07:00
|
|
|
|
|
|
|
int mStateModifyVirtualIndentLevel;
|
|
|
|
int mVirtualIndentLevel;
|
|
|
|
int mVirtualNewLineIdx;
|
2022-07-26 13:27:03 -04:00
|
|
|
|
2019-08-23 11:56:54 -07:00
|
|
|
Array<int>* mCharMapping;
|
|
|
|
int mHighestCharId;
|
|
|
|
|
2022-07-26 13:27:03 -04:00
|
|
|
public:
|
2019-08-23 11:56:54 -07:00
|
|
|
BfPrinter(BfRootNode* rootNode, BfRootNode* sidechannelRootNode, BfRootNode* errorRootNode);
|
2022-07-26 13:27:03 -04:00
|
|
|
|
|
|
|
public:
|
2022-05-24 06:20:35 -07:00
|
|
|
void Update(BfAstNode* bfAstNode);
|
2019-08-23 11:56:54 -07:00
|
|
|
bool CheckReplace(BfAstNode* astNode);
|
|
|
|
void FlushIndent();
|
2020-02-24 09:58:49 -08:00
|
|
|
void Write(const StringView& str);
|
2019-08-23 11:56:54 -07:00
|
|
|
void Write(BfAstNode* node, int start, int len);
|
|
|
|
void WriteSourceString(BfAstNode* node);
|
|
|
|
void QueueVisitChild(BfAstNode* astNode);
|
2022-07-26 13:27:03 -04:00
|
|
|
void QueueVisitErrorNodes(BfRootNode* astNode);
|
2019-08-23 11:56:54 -07:00
|
|
|
void FlushVisitChild();
|
|
|
|
void VisitChildWithPrecedingSpace(BfAstNode* bfAstNode);
|
|
|
|
void VisitChildWithProceedingSpace(BfAstNode* bfAstNode);
|
|
|
|
void ExpectSpace();
|
|
|
|
void ExpectNewLine();
|
|
|
|
void ExpectIndent();
|
|
|
|
void ExpectUnindent();
|
|
|
|
void VisitChildNextLine(BfAstNode* node);
|
2020-09-30 07:39:39 -07:00
|
|
|
void DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState);
|
|
|
|
void DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState);
|
2022-07-26 13:27:03 -04:00
|
|
|
void QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration);
|
2019-08-23 11:56:54 -07:00
|
|
|
int CalcOrigLineSpacing(BfAstNode* bfAstNode, int* lineStartIdx);
|
2022-07-26 13:27:03 -04:00
|
|
|
void WriteIgnoredNode(BfAstNode* node);
|
2020-12-28 09:10:49 -08:00
|
|
|
void CheckRawNode(BfAstNode* node);
|
2019-08-23 11:56:54 -07:00
|
|
|
|
|
|
|
virtual void Visit(BfAstNode* bfAstNode) override;
|
|
|
|
virtual void Visit(BfErrorNode* bfErrorNode) override;
|
2019-11-26 13:11:17 -08:00
|
|
|
virtual void Visit(BfScopeNode * scopeNode) override;
|
|
|
|
virtual void Visit(BfNewNode * newNode) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfExpression* expr) override;
|
|
|
|
virtual void Visit(BfExpressionStatement* exprStmt) override;
|
2022-06-24 18:41:54 -07:00
|
|
|
virtual void Visit(BfNamedExpression* namedExpr) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfAttributedExpression* attribExpr) override;
|
2022-07-26 13:27:03 -04:00
|
|
|
virtual void Visit(BfStatement* stmt) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfLabelableStatement* labelableStmt) override;
|
|
|
|
|
|
|
|
virtual void Visit(BfCommentNode* commentNode) override;
|
|
|
|
virtual void Visit(BfPreprocesorIgnoredSectionNode* preprocesorIgnoredSection) override;
|
|
|
|
virtual void Visit(BfPreprocessorNode* preprocessorNode) override;
|
|
|
|
|
2022-07-26 13:27:03 -04:00
|
|
|
virtual void Visit(BfAttributeDirective* attributeDirective) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfGenericParamsDeclaration* genericParams) override;
|
2019-11-22 12:28:24 -08:00
|
|
|
virtual void Visit(BfGenericOperatorConstraint* genericConstraints) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfGenericConstraintsDeclaration* genericConstraints) override;
|
|
|
|
virtual void Visit(BfGenericArgumentsNode* genericArgumentsNode) override;
|
|
|
|
|
2022-07-26 13:27:03 -04:00
|
|
|
virtual void Visit(BfEmptyStatement* emptyStmt) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfTokenNode* tokenNode) override;
|
2020-12-07 07:53:12 -08:00
|
|
|
virtual void Visit(BfTokenPairNode* tokenPairNode) override;
|
2022-07-13 07:07:38 -04:00
|
|
|
virtual void Visit(BfUsingSpecifierNode* usingSpecifier) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfLiteralExpression* literalExpr) override;
|
2020-11-11 05:46:52 -08:00
|
|
|
virtual void Visit(BfStringInterpolationExpression* stringInterpolationExpression) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfIdentifierNode* identifierNode) override;
|
|
|
|
virtual void Visit(BfQualifiedNameNode* nameNode) override;
|
|
|
|
virtual void Visit(BfThisExpression* thisExpr) override;
|
|
|
|
virtual void Visit(BfBaseExpression* baseExpr) override;
|
|
|
|
virtual void Visit(BfMixinExpression* mixinExpr) override;
|
|
|
|
virtual void Visit(BfSizedArrayCreateExpression* createExpr) override;
|
2020-06-18 06:12:14 -07:00
|
|
|
virtual void Visit(BfInitializerExpression* initExpr) override;
|
2022-07-26 13:27:03 -04:00
|
|
|
virtual void Visit(BfCollectionInitializerExpression* initExpr) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfTypeReference* typeRef) override;
|
|
|
|
virtual void Visit(BfNamedTypeReference* typeRef) override;
|
|
|
|
virtual void Visit(BfQualifiedTypeReference* qualifiedType) override;
|
|
|
|
virtual void Visit(BfVarTypeReference* typeRef) override;
|
|
|
|
virtual void Visit(BfLetTypeReference * typeRef) override;
|
|
|
|
virtual void Visit(BfConstTypeRef* typeRef) override;
|
|
|
|
virtual void Visit(BfConstExprTypeRef* typeRef) override;
|
|
|
|
virtual void Visit(BfRefTypeRef* typeRef) override;
|
|
|
|
virtual void Visit(BfArrayTypeRef* typeRef) override;
|
|
|
|
virtual void Visit(BfGenericInstanceTypeRef* typeRef) override;
|
|
|
|
virtual void Visit(BfTupleTypeRef * typeRef) override;
|
2024-11-08 09:16:27 -05:00
|
|
|
virtual void Visit(BfTagTypeRef* typeRef) override;
|
2020-01-31 16:10:23 -08:00
|
|
|
virtual void Visit(BfDelegateTypeRef* typeRef) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfPointerTypeRef* typeRef) override;
|
|
|
|
virtual void Visit(BfNullableTypeRef* typeRef) override;
|
2025-02-23 06:45:13 -08:00
|
|
|
virtual void Visit(BfInlineTypeReference* typeRef) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfVariableDeclaration* varDecl) override;
|
2022-07-26 13:27:03 -04:00
|
|
|
virtual void Visit(BfParameterDeclaration* paramDecl) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfTypeOfExpression* typeOfExpr) override;
|
|
|
|
virtual void Visit(BfSizeOfExpression* sizeOfExpr) override;
|
2021-09-10 14:21:25 -07:00
|
|
|
virtual void Visit(BfOffsetOfExpression* offsetOfExpr) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfDefaultExpression* defaultExpr) override;
|
2022-05-30 11:40:49 -07:00
|
|
|
virtual void Visit(BfIsConstExpression* isConstExpr) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfCheckTypeExpression* checkTypeExpr) override;
|
|
|
|
virtual void Visit(BfDynamicCastExpression* dynCastExpr) override;
|
|
|
|
virtual void Visit(BfCastExpression* castExpr) override;
|
2022-07-26 13:27:03 -04:00
|
|
|
virtual void Visit(BfDelegateBindExpression* invocationExpr) override;
|
2019-10-14 14:08:29 -07:00
|
|
|
virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfObjectCreateExpression* invocationExpr) override;
|
|
|
|
virtual void Visit(BfBoxExpression* boxExpr) override;
|
2022-07-26 13:27:03 -04:00
|
|
|
virtual void Visit(BfInvocationExpression* invocationExpr) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfSwitchCase* switchCase) override;
|
|
|
|
virtual void Visit(BfWhenExpression* whenExpr) override;
|
|
|
|
virtual void Visit(BfSwitchStatement* switchStmt) override;
|
|
|
|
virtual void Visit(BfTryStatement* tryStmt) override;
|
|
|
|
virtual void Visit(BfCatchStatement* catchStmt) override;
|
|
|
|
virtual void Visit(BfFinallyStatement* finallyStmt) override;
|
|
|
|
virtual void Visit(BfCheckedStatement* checkedStmt) override;
|
|
|
|
virtual void Visit(BfUncheckedStatement* uncheckedStmt) override;
|
|
|
|
virtual void Visit(BfIfStatement* ifStmt) override;
|
|
|
|
virtual void Visit(BfThrowStatement* throwStmt) override;
|
|
|
|
virtual void Visit(BfDeleteStatement* deleteStmt) override;
|
|
|
|
virtual void Visit(BfReturnStatement* returnStmt) override;
|
|
|
|
virtual void Visit(BfBreakStatement* breakStmt) override;
|
|
|
|
virtual void Visit(BfContinueStatement* continueStmt) override;
|
|
|
|
virtual void Visit(BfFallthroughStatement* fallthroughStmt) override;
|
|
|
|
virtual void Visit(BfUsingStatement* whileStmt) override;
|
|
|
|
virtual void Visit(BfDoStatement* whileStmt) override;
|
|
|
|
virtual void Visit(BfRepeatStatement* repeatStmt) override;
|
|
|
|
virtual void Visit(BfWhileStatement* whileStmt) override;
|
|
|
|
virtual void Visit(BfForStatement* forStmt) override;
|
|
|
|
virtual void Visit(BfForEachStatement* forEachStmt) override;
|
|
|
|
virtual void Visit(BfDeferStatement* deferStmt) override;
|
|
|
|
virtual void Visit(BfEnumCaseBindExpression * caseBindExpr) override;
|
|
|
|
virtual void Visit(BfCaseExpression * caseExpr) override;
|
|
|
|
virtual void Visit(BfConditionalExpression* condExpr) override;
|
|
|
|
virtual void Visit(BfAssignmentExpression* assignExpr) override;
|
|
|
|
virtual void Visit(BfParenthesizedExpression* parenExpr) override;
|
|
|
|
virtual void Visit(BfTupleExpression * tupleExpr) override;
|
|
|
|
virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override;
|
|
|
|
virtual void Visit(BfIndexerExpression* indexerExpr) override;
|
|
|
|
virtual void Visit(BfUnaryOperatorExpression* binOpExpr) override;
|
|
|
|
virtual void Visit(BfBinaryOperatorExpression* binOpExpr) override;
|
|
|
|
virtual void Visit(BfConstructorDeclaration* ctorDeclaration) override;
|
2022-08-01 10:47:17 -04:00
|
|
|
virtual void Visit(BfAutoConstructorDeclaration* ctorDeclaration) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfDestructorDeclaration* dtorDeclaration) override;
|
|
|
|
virtual void Visit(BfMethodDeclaration* methodDeclaration) override;
|
|
|
|
virtual void Visit(BfOperatorDeclaration* opreratorDeclaration) override;
|
|
|
|
virtual void Visit(BfPropertyMethodDeclaration* propertyDeclaration) override;
|
2022-01-03 14:41:12 -05:00
|
|
|
virtual void Visit(BfPropertyBodyExpression* propertyBodyExpression) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfPropertyDeclaration* propertyDeclaration) override;
|
2020-09-25 09:17:33 -07:00
|
|
|
virtual void Visit(BfIndexerDeclaration* indexerDeclaration) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfFieldDeclaration* fieldDeclaration) override;
|
|
|
|
virtual void Visit(BfEnumCaseDeclaration* enumCaseDeclaration) override;
|
|
|
|
virtual void Visit(BfTypeAliasDeclaration* typeDeclaration) override;
|
2021-12-11 10:46:21 -08:00
|
|
|
virtual void Visit(BfFieldDtorDeclaration* fieldDtorDeclaration) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfTypeDeclaration* typeDeclaration) override;
|
|
|
|
virtual void Visit(BfUsingDirective* usingDirective) override;
|
2020-10-14 11:33:41 -07:00
|
|
|
virtual void Visit(BfUsingModDirective* usingDirective) override;
|
2019-08-23 11:56:54 -07:00
|
|
|
virtual void Visit(BfNamespaceDeclaration* namespaceDeclaration) override;
|
|
|
|
virtual void Visit(BfBlock* block) override;
|
|
|
|
virtual void Visit(BfRootNode* rootNode) override;
|
|
|
|
virtual void Visit(BfInlineAsmStatement* asmStmt) override;
|
|
|
|
};
|
|
|
|
|
|
|
|
NS_BF_END
|