Sfoglia il codice sorgente

Improved formatting of string interpolation expressions

Brian Fiete 2 mesi fa
parent
commit
116d9c6f01
2 ha cambiato i file con 50 aggiunte e 5 eliminazioni
  1. 47 5
      IDEHelper/Compiler/BfPrinter.cpp
  2. 3 0
      IDEHelper/Compiler/BfPrinter.h

+ 47 - 5
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<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)

+ 3 - 0
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);