5092 final long templateToken = token; 5093 final boolean hasSubstitutions = type == TEMPLATE_HEAD; 5094 addTemplateLiteralString(rawStrings, cookedStrings); 5095 5096 if (hasSubstitutions) { 5097 TokenType lastLiteralType; 5098 do { 5099 final Expression expression = expression(); 5100 if (type != TEMPLATE_MIDDLE && type != TEMPLATE_TAIL) { 5101 throw error(AbstractParser.message("unterminated.template.expression"), token); 5102 } 5103 argumentList.add(expression); 5104 5105 lastLiteralType = type; 5106 addTemplateLiteralString(rawStrings, cookedStrings); 5107 } while (lastLiteralType == TEMPLATE_MIDDLE); 5108 } 5109 5110 final LiteralNode<Expression[]> rawStringArray = LiteralNode.newInstance(templateToken, finish, rawStrings); 5111 final LiteralNode<Expression[]> cookedStringArray = LiteralNode.newInstance(templateToken, finish, cookedStrings); 5112 final RuntimeNode templateObject = new RuntimeNode(templateToken, finish, RuntimeNode.Request.GET_TEMPLATE_OBJECT, rawStringArray, cookedStringArray); 5113 argumentList.set(0, templateObject); 5114 return optimizeList(argumentList); 5115 } 5116 5117 private void addTemplateLiteralString(final ArrayList<Expression> rawStrings, final ArrayList<Expression> cookedStrings) { 5118 final long stringToken = token; 5119 final String rawString = lexer.valueOfRawString(stringToken); 5120 final String cookedString = (String) getValue(); 5121 next(); 5122 rawStrings.add(LiteralNode.newInstance(stringToken, finish, rawString)); 5123 cookedStrings.add(LiteralNode.newInstance(stringToken, finish, cookedString)); 5124 } 5125 5126 5127 /** 5128 * Parse a module. 5129 * 5130 * Module : 5131 * ModuleBody? 5132 * 5133 * ModuleBody : | 5092 final long templateToken = token; 5093 final boolean hasSubstitutions = type == TEMPLATE_HEAD; 5094 addTemplateLiteralString(rawStrings, cookedStrings); 5095 5096 if (hasSubstitutions) { 5097 TokenType lastLiteralType; 5098 do { 5099 final Expression expression = expression(); 5100 if (type != TEMPLATE_MIDDLE && type != TEMPLATE_TAIL) { 5101 throw error(AbstractParser.message("unterminated.template.expression"), token); 5102 } 5103 argumentList.add(expression); 5104 5105 lastLiteralType = type; 5106 addTemplateLiteralString(rawStrings, cookedStrings); 5107 } while (lastLiteralType == TEMPLATE_MIDDLE); 5108 } 5109 5110 final LiteralNode<Expression[]> rawStringArray = LiteralNode.newInstance(templateToken, finish, rawStrings); 5111 final LiteralNode<Expression[]> cookedStringArray = LiteralNode.newInstance(templateToken, finish, cookedStrings); 5112 5113 if (!env._parse_only) { 5114 final RuntimeNode templateObject = new RuntimeNode(templateToken, finish, RuntimeNode.Request.GET_TEMPLATE_OBJECT, rawStringArray, cookedStringArray); 5115 argumentList.set(0, templateObject); 5116 } else { 5117 argumentList.set(0, rawStringArray); 5118 } 5119 return optimizeList(argumentList); 5120 } 5121 5122 private void addTemplateLiteralString(final ArrayList<Expression> rawStrings, final ArrayList<Expression> cookedStrings) { 5123 final long stringToken = token; 5124 final String rawString = lexer.valueOfRawString(stringToken); 5125 final String cookedString = (String) getValue(); 5126 next(); 5127 rawStrings.add(LiteralNode.newInstance(stringToken, finish, rawString)); 5128 cookedStrings.add(LiteralNode.newInstance(stringToken, finish, cookedString)); 5129 } 5130 5131 5132 /** 5133 * Parse a module. 5134 * 5135 * Module : 5136 * ModuleBody? 5137 * 5138 * ModuleBody : |