mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 03:28:20 +02:00
Improved formatting of string interpolation expressions
This commit is contained in:
parent
07a2e88960
commit
116d9c6f01
2 changed files with 50 additions and 5 deletions
|
@ -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<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)
|
||||
|
@ -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<BlockState*> 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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue