From 2ad5d7fac1e70aed75dce80ed7b767cfdea7f610 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 12 Feb 2022 09:42:42 -0500 Subject: [PATCH] Better string interpolation expr parsing --- IDEHelper/Compiler/BfParser.cpp | 32 +++++++++++++++++++++-- IDEHelper/Compiler/BfSourceClassifier.cpp | 1 + 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/IDEHelper/Compiler/BfParser.cpp b/IDEHelper/Compiler/BfParser.cpp index d721244a..051837ae 100644 --- a/IDEHelper/Compiler/BfParser.cpp +++ b/IDEHelper/Compiler/BfParser.cpp @@ -3355,6 +3355,7 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate) int startParseBlockIdx = gParseBlockIdx; bool isAsmBlock = false; + bool isTernary = false; SizedArray childArr; @@ -3453,7 +3454,34 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate) if ((isInterpolate) && (parenDepth == 0)) { - if ((mToken == BfToken_Colon) || (mToken == BfToken_Comma)) + if (mToken == BfToken_Question) + isTernary = true; + + bool endNow = false; + if (mToken == BfToken_Colon) + { + endNow = true; + if (!childArr.IsEmpty()) + { + if (auto prevToken = BfNodeDynCast(childArr.back())) + { + if ((prevToken->mToken == BfToken_Scope) || (prevToken->mToken == BfToken_New) || (prevToken->mToken == BfToken_Bang) || + (prevToken->mToken == BfToken_Colon)) + endNow = false; + } + } + + if ((endNow) && (isTernary)) + { + isTernary = false; + endNow = false; + } + } + + if (mToken == BfToken_Comma) + endNow = true; + + if (endNow) { mSrcIdx = mTokenStart; break; @@ -3461,7 +3489,7 @@ void BfParser::ParseBlock(BfBlock* astNode, int depth, bool isInterpolate) } astNode->Add(childNode); - childArr.push_back(childNode); + childArr.Add(childNode); if ((mSyntaxToken == BfSyntaxToken_Token) && (mToken == BfToken_RBrace)) break; diff --git a/IDEHelper/Compiler/BfSourceClassifier.cpp b/IDEHelper/Compiler/BfSourceClassifier.cpp index 6f0394dc..94ab8ae0 100644 --- a/IDEHelper/Compiler/BfSourceClassifier.cpp +++ b/IDEHelper/Compiler/BfSourceClassifier.cpp @@ -406,6 +406,7 @@ void BfSourceClassifier::Visit(BfStringInterpolationExpression* stringInterpolat VisitChild(stringInterpolationExpression->mAllocNode); for (auto& expr : stringInterpolationExpression->mExpressions) { + SetElementType(expr, BfSourceElementType_Normal); VisitChild(expr); } }