diff --git a/IDEHelper/Compiler/BfPrinter.cpp b/IDEHelper/Compiler/BfPrinter.cpp index 103f4c9b..d52784e7 100644 --- a/IDEHelper/Compiler/BfPrinter.cpp +++ b/IDEHelper/Compiler/BfPrinter.cpp @@ -1426,9 +1426,45 @@ void BfPrinter::Visit(BfLiteralExpression* literalExpr) void BfPrinter::Visit(BfStringInterpolationExpression* stringInterpolationExpression) { Visit(stringInterpolationExpression->ToBase()); + String str; stringInterpolationExpression->ToString(str); - Write(str); + + int startIdx = 0; + int exprIdx = 0; + + auto _Flush = [&](int endIdx) + { + Write(StringView(str, startIdx, endIdx - startIdx)); + startIdx = endIdx; + }; + + for (int strIdx = 0; strIdx < str.mLength; strIdx++) + { + char c = str[strIdx]; + + int curSrcIdx = stringInterpolationExpression->mSrcStart + strIdx; + + if (exprIdx < stringInterpolationExpression->mExpressions.mSize) + { + auto expr = stringInterpolationExpression->mExpressions[exprIdx]; + if (expr->mSrcStart == curSrcIdx) + { + _Flush(strIdx); + if (auto block = BfNodeDynCast(expr)) + HandleBlock(block, true); + else + VisitChild(expr); + exprIdx++; + + strIdx = expr->mSrcEnd - stringInterpolationExpression->mSrcStart; + startIdx = strIdx; + continue; + } + } + } + + _Flush(str.mLength); } void BfPrinter::Visit(BfIdentifierNode* identifierNode) @@ -3251,7 +3287,7 @@ void BfPrinter::DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfToken if (prevNode != NULL) ExpectIndent(); } - else + else if (!blockState.mIsCompact) ExpectSpace(); if (queue) QueueVisitChild(blockOpen); @@ -3259,7 +3295,7 @@ void BfPrinter::DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfToken VisitChild(blockOpen); if (!doInlineBlock) ExpectIndent(); - else + else if (!blockState.mIsCompact) ExpectSpace(); blockState.mDoInlineBlock = doInlineBlock; } @@ -3271,7 +3307,7 @@ void BfPrinter::DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfToke ExpectUnindent(); mNextStateModify.mDoingBlockClose = true; } - else + else if (!blockState.mIsCompact) ExpectSpace(); if (queue) QueueVisitChild(blockClose); @@ -3285,10 +3321,11 @@ void BfPrinter::DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfToke } } -void BfPrinter::Visit(BfBlock* block) +void BfPrinter::HandleBlock(BfBlock* block, bool isCompact) { BlockState blockState; SetAndRestoreValue prevBlockState(mCurBlockState, &blockState); + blockState.mIsCompact = isCompact; DoBlockOpen(NULL, block->mOpenBrace, block->mCloseBrace, false, blockState); for (auto& childNodeRef : *block) @@ -3305,6 +3342,11 @@ void BfPrinter::Visit(BfBlock* block) ExpectNewLine(); } +void BfPrinter::Visit(BfBlock* block) +{ + HandleBlock(block); +} + void BfPrinter::Visit(BfRootNode* rootNode) { for (auto child : rootNode->mChildArr) diff --git a/IDEHelper/Compiler/BfPrinter.h b/IDEHelper/Compiler/BfPrinter.h index 1e1f63c9..a56b136e 100644 --- a/IDEHelper/Compiler/BfPrinter.h +++ b/IDEHelper/Compiler/BfPrinter.h @@ -12,12 +12,14 @@ public: { int mLastSpaceOffset; bool mDoInlineBlock; + bool mIsCompact; int mIndentStart; BlockState() { mLastSpaceOffset = 0; mDoInlineBlock = false; + mIsCompact = false; mIndentStart = 0; } }; @@ -129,6 +131,7 @@ public: void VisitChildNextLine(BfAstNode* node); void DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState); void DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState); + void HandleBlock(BfBlock* block, bool isCompact = false); void QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration); int CalcOrigLineSpacing(BfAstNode* bfAstNode, int* lineStartIdx); void WriteIgnoredNode(BfAstNode* node);