1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Improved formatting of string interpolation expressions

This commit is contained in:
Brian Fiete 2025-05-28 11:02:12 +02:00
parent 07a2e88960
commit 116d9c6f01
2 changed files with 50 additions and 5 deletions

View file

@ -1426,9 +1426,45 @@ void BfPrinter::Visit(BfLiteralExpression* literalExpr)
void BfPrinter::Visit(BfStringInterpolationExpression* stringInterpolationExpression) void BfPrinter::Visit(BfStringInterpolationExpression* stringInterpolationExpression)
{ {
Visit(stringInterpolationExpression->ToBase()); Visit(stringInterpolationExpression->ToBase());
String str; String str;
stringInterpolationExpression->ToString(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<BfBlock>(expr))
HandleBlock(block, true);
else
VisitChild(expr);
exprIdx++;
strIdx = expr->mSrcEnd - stringInterpolationExpression->mSrcStart;
startIdx = strIdx;
continue;
}
}
}
_Flush(str.mLength);
} }
void BfPrinter::Visit(BfIdentifierNode* identifierNode) void BfPrinter::Visit(BfIdentifierNode* identifierNode)
@ -3251,7 +3287,7 @@ void BfPrinter::DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfToken
if (prevNode != NULL) if (prevNode != NULL)
ExpectIndent(); ExpectIndent();
} }
else else if (!blockState.mIsCompact)
ExpectSpace(); ExpectSpace();
if (queue) if (queue)
QueueVisitChild(blockOpen); QueueVisitChild(blockOpen);
@ -3259,7 +3295,7 @@ void BfPrinter::DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfToken
VisitChild(blockOpen); VisitChild(blockOpen);
if (!doInlineBlock) if (!doInlineBlock)
ExpectIndent(); ExpectIndent();
else else if (!blockState.mIsCompact)
ExpectSpace(); ExpectSpace();
blockState.mDoInlineBlock = doInlineBlock; blockState.mDoInlineBlock = doInlineBlock;
} }
@ -3271,7 +3307,7 @@ void BfPrinter::DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfToke
ExpectUnindent(); ExpectUnindent();
mNextStateModify.mDoingBlockClose = true; mNextStateModify.mDoingBlockClose = true;
} }
else else if (!blockState.mIsCompact)
ExpectSpace(); ExpectSpace();
if (queue) if (queue)
QueueVisitChild(blockClose); 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; BlockState blockState;
SetAndRestoreValue<BlockState*> prevBlockState(mCurBlockState, &blockState); SetAndRestoreValue<BlockState*> prevBlockState(mCurBlockState, &blockState);
blockState.mIsCompact = isCompact;
DoBlockOpen(NULL, block->mOpenBrace, block->mCloseBrace, false, blockState); DoBlockOpen(NULL, block->mOpenBrace, block->mCloseBrace, false, blockState);
for (auto& childNodeRef : *block) for (auto& childNodeRef : *block)
@ -3305,6 +3342,11 @@ void BfPrinter::Visit(BfBlock* block)
ExpectNewLine(); ExpectNewLine();
} }
void BfPrinter::Visit(BfBlock* block)
{
HandleBlock(block);
}
void BfPrinter::Visit(BfRootNode* rootNode) void BfPrinter::Visit(BfRootNode* rootNode)
{ {
for (auto child : rootNode->mChildArr) for (auto child : rootNode->mChildArr)

View file

@ -12,12 +12,14 @@ public:
{ {
int mLastSpaceOffset; int mLastSpaceOffset;
bool mDoInlineBlock; bool mDoInlineBlock;
bool mIsCompact;
int mIndentStart; int mIndentStart;
BlockState() BlockState()
{ {
mLastSpaceOffset = 0; mLastSpaceOffset = 0;
mDoInlineBlock = false; mDoInlineBlock = false;
mIsCompact = false;
mIndentStart = 0; mIndentStart = 0;
} }
}; };
@ -129,6 +131,7 @@ public:
void VisitChildNextLine(BfAstNode* node); void VisitChildNextLine(BfAstNode* node);
void DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState); 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 DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState);
void HandleBlock(BfBlock* block, bool isCompact = false);
void QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration); void QueueMethodDeclaration(BfMethodDeclaration* methodDeclaration);
int CalcOrigLineSpacing(BfAstNode* bfAstNode, int* lineStartIdx); int CalcOrigLineSpacing(BfAstNode* bfAstNode, int* lineStartIdx);
void WriteIgnoredNode(BfAstNode* node); void WriteIgnoredNode(BfAstNode* node);