1
0
Fork 0
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:
Brian Fiete 2020-09-30 07:39:39 -07:00
parent 5746214198
commit c58e30e005
3 changed files with 112 additions and 37 deletions

View file

@ -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;
} }

View file

@ -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();
} }

View file

@ -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);