Pārlūkot izejas kodu

Fixed formatting of interpolated strings with format specifiers

Brian Fiete 1 mēnesi atpakaļ
vecāks
revīzija
f6075549db
2 mainītis faili ar 21 papildinājumiem un 4 dzēšanām
  1. 20 3
      IDEHelper/Compiler/BfPrinter.cpp
  2. 1 1
      IDEHelper/Compiler/BfPrinter.h

+ 20 - 3
IDEHelper/Compiler/BfPrinter.cpp

@@ -1457,13 +1457,28 @@ void BfPrinter::Visit(BfStringInterpolationExpression* stringInterpolationExpres
 				mVirtualNewLineIdx = mNextStateModify.mWantNewLineIdx;
 				mVirtualNewLineIdx = mNextStateModify.mWantNewLineIdx;
 				mNextStateModify.mExpectingSpace = false;
 				mNextStateModify.mExpectingSpace = false;
 
 
+				int strEndIdx = expr->mSrcEnd - stringInterpolationExpression->mSrcStart;
+
 				if (auto block = BfNodeDynCast<BfBlock>(expr))
 				if (auto block = BfNodeDynCast<BfBlock>(expr))
-					HandleBlock(block, true);
+				{
+					int lastChildSrcIdx = exprIdx + 1;
+					if (block->mChildArr.mSize > 0)
+						lastChildSrcIdx = block->mChildArr.back()->mSrcEnd - stringInterpolationExpression->mSrcStart;
+
+					String formatStr;
+					for (int i = lastChildSrcIdx; i < strEndIdx - 1; i++)					
+						formatStr += str[i];					
+					formatStr = Trim(formatStr);
+					
+					int startOutStrLen = mOutString.mLength;
+
+					HandleBlock(block, true, &formatStr);					
+				}
 				else
 				else
 					VisitChild(expr);
 					VisitChild(expr);
 				exprIdx++;
 				exprIdx++;
 
 
-				strIdx = expr->mSrcEnd - stringInterpolationExpression->mSrcStart;
+				strIdx = strEndIdx;
 				startIdx = strIdx;
 				startIdx = strIdx;
 				continue;
 				continue;
 			}			
 			}			
@@ -3327,7 +3342,7 @@ void BfPrinter::DoBlockClose(BfAstNode* prevNode, BfTokenNode* blockOpen, BfToke
 	}
 	}
 }
 }
 
 
-void BfPrinter::HandleBlock(BfBlock* block, bool isCompact)
+void BfPrinter::HandleBlock(BfBlock* block, bool isCompact, StringImpl* endString)
 {
 {
 	BlockState blockState;
 	BlockState blockState;
 	SetAndRestoreValue<BlockState*> prevBlockState(mCurBlockState, &blockState);
 	SetAndRestoreValue<BlockState*> prevBlockState(mCurBlockState, &blockState);
@@ -3343,6 +3358,8 @@ void BfPrinter::HandleBlock(BfBlock* block, bool isCompact)
 		CheckRawNode(child);
 		CheckRawNode(child);
 		child->Accept(this);
 		child->Accept(this);
 	}
 	}
+	if (endString != NULL)
+		Write(*endString);
 	DoBlockClose(NULL, block->mOpenBrace, block->mCloseBrace, false, blockState);
 	DoBlockClose(NULL, block->mOpenBrace, block->mCloseBrace, false, blockState);
 
 
 	ExpectNewLine();
 	ExpectNewLine();

+ 1 - 1
IDEHelper/Compiler/BfPrinter.h

@@ -131,7 +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 HandleBlock(BfBlock* block, bool isCompact = false, StringImpl* endString = NULL);
 	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);