157157import com .oracle .js .parser .ir .PropertyKey ;
158158import com .oracle .js .parser .ir .PropertyNode ;
159159import com .oracle .js .parser .ir .ReturnNode ;
160- import com .oracle .js .parser .ir .RuntimeNode ;
161160import com .oracle .js .parser .ir .Scope ;
162161import com .oracle .js .parser .ir .Statement ;
163162import com .oracle .js .parser .ir .SwitchNode ;
164163import com .oracle .js .parser .ir .Symbol ;
164+ import com .oracle .js .parser .ir .TemplateLiteralNode ;
165165import com .oracle .js .parser .ir .TernaryNode ;
166166import com .oracle .js .parser .ir .ThrowNode ;
167167import com .oracle .js .parser .ir .TryNode ;
@@ -4412,7 +4412,7 @@ private Expression leftHandSideExpression(boolean yield, boolean await) {
44124412
44134413 final List <Expression > arguments = templateLiteralArgumentList (yield , await );
44144414
4415- lhs = CallNode .forCall (callLine , callToken , lhs .getStart (), finish , lhs , arguments , false , optionalChain );
4415+ lhs = CallNode .forTaggedTemplateLiteral (callLine , callToken , lhs .getStart (), finish , lhs , arguments );
44164416
44174417 break ;
44184418 }
@@ -6190,7 +6190,7 @@ private void endOfLine() {
61906190 private Expression templateLiteral (boolean yield , boolean await ) {
61916191 assert type == TEMPLATE || type == TEMPLATE_HEAD ;
61926192 final boolean noSubstitutionTemplate = type == TEMPLATE ;
6193- long lastLiteralToken = token ;
6193+ final long startToken = token ;
61946194 boolean previousPauseOnRightBrace = lexer .pauseOnRightBrace ;
61956195 try {
61966196 lexer .pauseOnRightBrace = true ;
@@ -6199,18 +6199,17 @@ private Expression templateLiteral(boolean yield, boolean await) {
61996199 return literal ;
62006200 }
62016201
6202- Expression concat = literal ;
6202+ List <Expression > expressions = new ArrayList <>();
6203+ expressions .add (literal );
62036204 TokenType lastLiteralType ;
62046205 do {
62056206 Expression expression = templateLiteralExpression (yield , await );
6206- expression = new RuntimeNode (Token .recast (expression .getToken (), VOID ), expression .getFinish (), RuntimeNode .Request .TO_STRING , expression );
6207- concat = new BinaryNode (Token .recast (lastLiteralToken , TokenType .ADD ), concat , expression );
6207+ expressions .add (expression );
62086208 lastLiteralType = type ;
6209- lastLiteralToken = token ;
62106209 literal = getLiteral ();
6211- concat = new BinaryNode ( Token . recast ( lastLiteralToken , TokenType . ADD ), concat , literal );
6210+ expressions . add ( literal );
62126211 } while (lastLiteralType == TEMPLATE_MIDDLE );
6213- return concat ;
6212+ return TemplateLiteralNode . newUntagged ( startToken , literal . getFinish (), expressions ) ;
62146213 } finally {
62156214 lexer .pauseOnRightBrace = previousPauseOnRightBrace ;
62166215 }
@@ -6261,9 +6260,7 @@ private List<Expression> templateLiteralArgumentList(boolean yield, boolean awai
62616260 } while (lastLiteralType == TEMPLATE_MIDDLE );
62626261 }
62636262
6264- final LiteralNode <Expression []> rawStringArray = LiteralNode .newInstance (templateToken , finish , rawStrings );
6265- final LiteralNode <Expression []> cookedStringArray = LiteralNode .newInstance (templateToken , finish , cookedStrings );
6266- final RuntimeNode templateObject = new RuntimeNode (templateToken , finish , RuntimeNode .Request .GET_TEMPLATE_OBJECT , rawStringArray , cookedStringArray );
6263+ final Expression templateObject = TemplateLiteralNode .newTagged (templateToken , rawStrings .get (rawStrings .size () - 1 ).getFinish (), rawStrings , cookedStrings );
62676264 argumentList .set (0 , templateObject );
62686265 return optimizeList (argumentList );
62696266 } finally {
0 commit comments