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 ;
@@ -4411,7 +4411,7 @@ private Expression leftHandSideExpression(boolean yield, boolean await) {
44114411
44124412 final List <Expression > arguments = templateLiteralArgumentList (yield , await );
44134413
4414- lhs = CallNode .forCall (callLine , callToken , lhs .getStart (), finish , lhs , arguments , false , optionalChain );
4414+ lhs = CallNode .forTaggedTemplateLiteral (callLine , callToken , lhs .getStart (), finish , lhs , arguments );
44154415
44164416 break ;
44174417 }
@@ -6189,7 +6189,7 @@ private void endOfLine() {
61896189 private Expression templateLiteral (boolean yield , boolean await ) {
61906190 assert type == TEMPLATE || type == TEMPLATE_HEAD ;
61916191 final boolean noSubstitutionTemplate = type == TEMPLATE ;
6192- long lastLiteralToken = token ;
6192+ final long startToken = token ;
61936193 boolean previousPauseOnRightBrace = lexer .pauseOnRightBrace ;
61946194 try {
61956195 lexer .pauseOnRightBrace = true ;
@@ -6198,18 +6198,17 @@ private Expression templateLiteral(boolean yield, boolean await) {
61986198 return literal ;
61996199 }
62006200
6201- Expression concat = literal ;
6201+ List <Expression > expressions = new ArrayList <>();
6202+ expressions .add (literal );
62026203 TokenType lastLiteralType ;
62036204 do {
62046205 Expression expression = templateLiteralExpression (yield , await );
6205- expression = new RuntimeNode (Token .recast (expression .getToken (), VOID ), expression .getFinish (), RuntimeNode .Request .TO_STRING , expression );
6206- concat = new BinaryNode (Token .recast (lastLiteralToken , TokenType .ADD ), concat , expression );
6206+ expressions .add (expression );
62076207 lastLiteralType = type ;
6208- lastLiteralToken = token ;
62096208 literal = getLiteral ();
6210- concat = new BinaryNode ( Token . recast ( lastLiteralToken , TokenType . ADD ), concat , literal );
6209+ expressions . add ( literal );
62116210 } while (lastLiteralType == TEMPLATE_MIDDLE );
6212- return concat ;
6211+ return TemplateLiteralNode . newUntagged ( startToken , literal . getFinish (), expressions ) ;
62136212 } finally {
62146213 lexer .pauseOnRightBrace = previousPauseOnRightBrace ;
62156214 }
@@ -6260,9 +6259,7 @@ private List<Expression> templateLiteralArgumentList(boolean yield, boolean awai
62606259 } while (lastLiteralType == TEMPLATE_MIDDLE );
62616260 }
62626261
6263- final LiteralNode <Expression []> rawStringArray = LiteralNode .newInstance (templateToken , finish , rawStrings );
6264- final LiteralNode <Expression []> cookedStringArray = LiteralNode .newInstance (templateToken , finish , cookedStrings );
6265- final RuntimeNode templateObject = new RuntimeNode (templateToken , finish , RuntimeNode .Request .GET_TEMPLATE_OBJECT , rawStringArray , cookedStringArray );
6262+ final Expression templateObject = TemplateLiteralNode .newTagged (templateToken , rawStrings .get (rawStrings .size () - 1 ).getFinish (), rawStrings , cookedStrings );
62666263 argumentList .set (0 , templateObject );
62676264 return optimizeList (argumentList );
62686265 } finally {
0 commit comments