mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Formatting fixes for initializer expressions
This commit is contained in:
parent
5746214198
commit
c58e30e005
3 changed files with 112 additions and 37 deletions
|
@ -1871,6 +1871,7 @@ namespace IDE.ui
|
||||||
GetLineText(lineIdx, lineText);
|
GetLineText(lineIdx, lineText);
|
||||||
if (String.IsNullOrWhiteSpace(lineText)) // Is on new line?
|
if (String.IsNullOrWhiteSpace(lineText)) // Is on new line?
|
||||||
{
|
{
|
||||||
|
lineText.Clear();
|
||||||
GetLineText(lineIdx - 1, lineText);
|
GetLineText(lineIdx - 1, lineText);
|
||||||
for (int32 i = 0; i < lineText.Length; i++)
|
for (int32 i = 0; i < lineText.Length; i++)
|
||||||
{
|
{
|
||||||
|
@ -1886,6 +1887,30 @@ namespace IDE.ui
|
||||||
if (mAllowVirtualCursor)
|
if (mAllowVirtualCursor)
|
||||||
{
|
{
|
||||||
int column = GetLineEndColumn(lineIdx, true, false, true);
|
int column = GetLineEndColumn(lineIdx, true, false, true);
|
||||||
|
|
||||||
|
// If we're aligned with the previous line then do the 'block indent' logic, otherwise are are already indented
|
||||||
|
if (indentCount == column / 4)
|
||||||
|
{
|
||||||
|
char8 prevC = 0;
|
||||||
|
int checkIdx = CursorTextPos - 1;
|
||||||
|
while (checkIdx >= 0)
|
||||||
|
{
|
||||||
|
let displayType = (SourceElementType)mData.mText[checkIdx].mDisplayTypeId;
|
||||||
|
if (displayType == .Comment)
|
||||||
|
continue;
|
||||||
|
prevC = mData.mText[checkIdx].mChar;
|
||||||
|
if (!prevC.IsWhiteSpace)
|
||||||
|
break;
|
||||||
|
checkIdx--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((prevC == '>') || (prevC == ')'))
|
||||||
|
{
|
||||||
|
// Lambda opening or initializer expression
|
||||||
|
column += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CursorLineAndColumn = LineAndColumn(lineIdx, column);
|
CursorLineAndColumn = LineAndColumn(lineIdx, column);
|
||||||
indentCount = column / 4;
|
indentCount = column / 4;
|
||||||
}
|
}
|
||||||
|
|
|
@ -759,9 +759,12 @@ void BfPrinter::Visit(BfAstNode* bfAstNode)
|
||||||
{
|
{
|
||||||
Write("\n");
|
Write("\n");
|
||||||
mQueuedSpaceCount = mCurIndentLevel * 4;
|
mQueuedSpaceCount = mCurIndentLevel * 4;
|
||||||
|
if (!mNextStateModify.mDoingBlockClose)
|
||||||
|
{
|
||||||
int origLineSpacing = CalcOrigLineSpacing(bfAstNode, NULL);
|
int origLineSpacing = CalcOrigLineSpacing(bfAstNode, NULL);
|
||||||
if (origLineSpacing != -1)
|
if (origLineSpacing != -1)
|
||||||
mLastSpaceOffset = mQueuedSpaceCount - origLineSpacing;
|
mLastSpaceOffset = mQueuedSpaceCount - origLineSpacing;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
idx--;
|
idx--;
|
||||||
|
@ -1211,18 +1214,40 @@ void BfPrinter::Visit(BfInitializerExpression* initExpr)
|
||||||
Visit(initExpr->ToBase());
|
Visit(initExpr->ToBase());
|
||||||
|
|
||||||
VisitChild(initExpr->mTarget);
|
VisitChild(initExpr->mTarget);
|
||||||
ExpectSpace();
|
BlockState blockState;
|
||||||
VisitChild(initExpr->mOpenBrace);
|
DoBlockOpen(initExpr->mTarget, initExpr->mOpenBrace, initExpr->mCloseBrace, false, blockState);
|
||||||
for (int i = 0; i < (int)initExpr->mValues.size(); i++)
|
for (int i = 0; i < (int)initExpr->mValues.size(); i++)
|
||||||
{
|
{
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
{
|
{
|
||||||
VisitChildNoRef(initExpr->mCommas.GetSafe(i - 1));
|
VisitChildNoRef(initExpr->mCommas.GetSafe(i - 1));
|
||||||
|
if (blockState.mDoInlineBlock)
|
||||||
ExpectSpace();
|
ExpectSpace();
|
||||||
|
else
|
||||||
|
ExpectNewLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
VisitChild(initExpr->mValues[i]);
|
VisitChild(initExpr->mValues[i]);
|
||||||
}
|
}
|
||||||
VisitChild(initExpr->mCloseBrace);
|
DoBlockClose(initExpr->mTarget, initExpr->mOpenBrace, initExpr->mCloseBrace, false, blockState);
|
||||||
|
|
||||||
|
// Visit(initExpr->ToBase());
|
||||||
|
//
|
||||||
|
// VisitChild(initExpr->mTarget);
|
||||||
|
// ExpectSpace();
|
||||||
|
// VisitChild(initExpr->mOpenBrace);
|
||||||
|
// ExpectIndent();
|
||||||
|
// for (int i = 0; i < (int)initExpr->mValues.size(); i++)
|
||||||
|
// {
|
||||||
|
// if (i > 0)
|
||||||
|
// {
|
||||||
|
// VisitChildNoRef(initExpr->mCommas.GetSafe(i - 1));
|
||||||
|
// ExpectSpace();
|
||||||
|
// }
|
||||||
|
// VisitChild(initExpr->mValues[i]);
|
||||||
|
// }
|
||||||
|
// ExpectUnindent();
|
||||||
|
// VisitChild(initExpr->mCloseBrace);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BfPrinter::Visit(BfCollectionInitializerExpression* initExpr)
|
void BfPrinter::Visit(BfCollectionInitializerExpression* initExpr)
|
||||||
|
@ -1230,7 +1255,7 @@ void BfPrinter::Visit(BfCollectionInitializerExpression* initExpr)
|
||||||
Visit(initExpr->ToBase());
|
Visit(initExpr->ToBase());
|
||||||
|
|
||||||
VisitChild(initExpr->mOpenBrace);
|
VisitChild(initExpr->mOpenBrace);
|
||||||
for (int i = 0; i < (int) initExpr->mValues.size(); i++)
|
for (int i = 0; i < (int)initExpr->mValues.size(); i++)
|
||||||
{
|
{
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
{
|
{
|
||||||
|
@ -2435,15 +2460,14 @@ void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration)
|
||||||
|
|
||||||
if (auto block = BfNodeDynCast<BfBlock>(propertyDeclaration->mDefinitionBlock))
|
if (auto block = BfNodeDynCast<BfBlock>(propertyDeclaration->mDefinitionBlock))
|
||||||
{
|
{
|
||||||
bool doInlineBlock = false;
|
BlockState blockState;
|
||||||
int indentStart = 0;
|
DoBlockOpen(NULL, block->mOpenBrace, block->mCloseBrace, true, blockState);
|
||||||
DoBlockOpen(block, true, &doInlineBlock, &indentStart);
|
|
||||||
for (auto method : propertyDeclaration->mMethods)
|
for (auto method : propertyDeclaration->mMethods)
|
||||||
{
|
{
|
||||||
Visit(method);
|
Visit(method);
|
||||||
}
|
}
|
||||||
FlushVisitChild();
|
FlushVisitChild();
|
||||||
DoBlockClose(block, true, doInlineBlock, indentStart);
|
DoBlockClose(NULL, block->mOpenBrace, block->mCloseBrace, true, blockState);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2755,16 +2779,22 @@ void BfPrinter::Visit(BfNamespaceDeclaration* namespaceDeclaration)
|
||||||
VisitChild(namespaceDeclaration->mBlock);
|
VisitChild(namespaceDeclaration->mBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BfPrinter::DoBlockOpen(BfBlock* block, bool queue, bool* outDoInlineBlock, int* outIdentStart)
|
void BfPrinter::DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState)
|
||||||
{
|
{
|
||||||
*outIdentStart = mNextStateModify.mWantVirtualIndent;
|
blockState.mLastSpaceOffset = mLastSpaceOffset;
|
||||||
|
blockState.mIndentStart = mNextStateModify.mWantVirtualIndent;
|
||||||
|
|
||||||
bool doInlineBlock = true;
|
bool doInlineBlock = true;
|
||||||
if (block->mCloseBrace != NULL)
|
if (blockClose != NULL)
|
||||||
{
|
{
|
||||||
auto blockSrc = block->GetSourceData();
|
auto blockSrc = blockOpen->GetSourceData();
|
||||||
int srcEnd = block->mCloseBrace->GetSrcEnd();
|
int srcEnd = blockClose->GetSrcEnd();
|
||||||
for (int i = block->mOpenBrace->GetSrcStart(); i < srcEnd; i++)
|
|
||||||
|
int srcStart = blockOpen->GetSrcStart();
|
||||||
|
if (prevNode != NULL)
|
||||||
|
srcStart = prevNode->GetSrcEnd();
|
||||||
|
|
||||||
|
for (int i = srcStart; i < srcEnd; i++)
|
||||||
{
|
{
|
||||||
if (blockSrc->mSrc[i] == '\n')
|
if (blockSrc->mSrc[i] == '\n')
|
||||||
doInlineBlock = false;
|
doInlineBlock = false;
|
||||||
|
@ -2775,41 +2805,47 @@ void BfPrinter::DoBlockOpen(BfBlock* block, bool queue, bool* outDoInlineBlock,
|
||||||
{
|
{
|
||||||
ExpectNewLine();
|
ExpectNewLine();
|
||||||
mNextStateModify.mDoingBlockOpen = true;
|
mNextStateModify.mDoingBlockOpen = true;
|
||||||
|
if (prevNode != NULL)
|
||||||
|
ExpectIndent();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ExpectSpace();
|
ExpectSpace();
|
||||||
if (queue)
|
if (queue)
|
||||||
QueueVisitChild(block->mOpenBrace);
|
QueueVisitChild(blockOpen);
|
||||||
else
|
else
|
||||||
VisitChild(block->mOpenBrace);
|
VisitChild(blockOpen);
|
||||||
if (!doInlineBlock)
|
if (!doInlineBlock)
|
||||||
ExpectIndent();
|
ExpectIndent();
|
||||||
else
|
else
|
||||||
ExpectSpace();
|
ExpectSpace();
|
||||||
*outDoInlineBlock = doInlineBlock;
|
blockState.mDoInlineBlock = doInlineBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
void BfPrinter::DoBlockClose(BfBlock* block, bool queue, bool doInlineBlock, int indentStart)
|
void BfPrinter::DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState)
|
||||||
{
|
{
|
||||||
if (!doInlineBlock)
|
if (!blockState.mDoInlineBlock)
|
||||||
{
|
{
|
||||||
ExpectUnindent();
|
ExpectUnindent();
|
||||||
mNextStateModify.mWantVirtualIndent = indentStart;
|
|
||||||
mNextStateModify.mDoingBlockClose = true;
|
mNextStateModify.mDoingBlockClose = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ExpectSpace();
|
ExpectSpace();
|
||||||
if (queue)
|
if (queue)
|
||||||
QueueVisitChild(block->mCloseBrace);
|
QueueVisitChild(blockClose);
|
||||||
else
|
else
|
||||||
VisitChild(block->mCloseBrace);
|
VisitChild(blockClose);
|
||||||
|
|
||||||
|
if (!blockState.mDoInlineBlock)
|
||||||
|
{
|
||||||
|
mNextStateModify.mWantVirtualIndent = blockState.mIndentStart;
|
||||||
|
mLastSpaceOffset = blockState.mLastSpaceOffset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BfPrinter::Visit(BfBlock* block)
|
void BfPrinter::Visit(BfBlock* block)
|
||||||
{
|
{
|
||||||
bool doInlineBlock;
|
BlockState blockState;
|
||||||
int indentStart = 0;
|
DoBlockOpen(NULL, block->mOpenBrace, block->mCloseBrace, false, blockState);
|
||||||
DoBlockOpen(block, false, &doInlineBlock, &indentStart);
|
|
||||||
for (auto& childNodeRef : *block)
|
for (auto& childNodeRef : *block)
|
||||||
{
|
{
|
||||||
BfAstNode* child = childNodeRef;
|
BfAstNode* child = childNodeRef;
|
||||||
|
@ -2821,7 +2857,7 @@ void BfPrinter::Visit(BfBlock* block)
|
||||||
SetAndRestoreValue<BfAstNode*> prevBlockMember(mCurBlockMember, child);
|
SetAndRestoreValue<BfAstNode*> prevBlockMember(mCurBlockMember, child);
|
||||||
child->Accept(this);
|
child->Accept(this);
|
||||||
}
|
}
|
||||||
DoBlockClose(block, false, doInlineBlock, indentStart);
|
DoBlockClose(NULL, block->mOpenBrace, block->mCloseBrace, false, blockState);
|
||||||
|
|
||||||
ExpectNewLine();
|
ExpectNewLine();
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,20 @@ NS_BF_BEGIN
|
||||||
class BfPrinter : public BfElementVisitor
|
class BfPrinter : public BfElementVisitor
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
struct BlockState
|
||||||
|
{
|
||||||
|
int mLastSpaceOffset;
|
||||||
|
bool mDoInlineBlock;
|
||||||
|
int mIndentStart;
|
||||||
|
|
||||||
|
BlockState()
|
||||||
|
{
|
||||||
|
mLastSpaceOffset = 0;
|
||||||
|
mDoInlineBlock = false;
|
||||||
|
mIndentStart = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct StateModify
|
struct StateModify
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -95,8 +109,8 @@ public:
|
||||||
void ExpectIndent();
|
void ExpectIndent();
|
||||||
void ExpectUnindent();
|
void ExpectUnindent();
|
||||||
void VisitChildNextLine(BfAstNode* node);
|
void VisitChildNextLine(BfAstNode* node);
|
||||||
void DoBlockOpen(BfBlock* block, bool queue, bool* outDoInlineBlock, int* outIdentStart);
|
void DoBlockOpen(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState);
|
||||||
void DoBlockClose(BfBlock* block, bool queue, bool doInlineBlock, int identStart);
|
void DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfTokenNode* blockClose, bool queue, BlockState& blockState);
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue