RFR 8134941: Implement ES6 template literal support

Andreas Woess andreas.woess at oracle.com
Thu Sep 3 16:49:17 UTC 2015


Please review http://cr.openjdk.java.net/~aw/8134941/ for 
https://bugs.openjdk.java.net/browse/JDK-8134941 .

This change adds support for ES6 template literals (both untagged and 
tagged). This is rather heavy patch, so let me walk you through it.

Instead of using the existing EditStringLexer, I took a somewhat 
different approach. I've added 4 lexer tokens for the different template 
string portions cf. 11.8.6 and let the parser decide what to do with it. 
These are then treated different depending on whether the literal is tagged:
* untagged: desugared to a string concatenation using +
* tagged: desugared to function call (cf. 12.2.9.2) tag( 
RuntimeCall(GET_TEMPLATE_OBJECT, [...rawStrings], [...cookedStrings]), 
...evaluatedExpressions ), where rawStrings and cookedStrings are the 
unescaped and escaped string portions, respectively. CR and CRLF in the 
strings are always converted to LF.

The EditStringLexer did not correctly count quoted braces in embedded 
expressions (e.g., `${ "}" }` would error), so I've hooked an open brace 
counter into Lexer#lexify() directly that is context-aware. It's purpose 
is to break out of the nested Lexer at the closing RBRACE, and then 
continue with scanning the rest of the literal.
Template literals are always scanned as a whole, quote-to-quote (as with 
EditStringLexer). This turned out to be a problem with embedded 
functions in expressions and lazy/optimistic compilation on: 
Parser#skipFunctionBody would skip over the body and restart lexing at 
the RBRACE, forgetting about the embedding string context. I've worked 
around this in skipFunctionBody by skipping over to the RBRACE directly 
if it is already in the token stream (which it is because we've already 
scanned to the end quote).

Template strings use the same quotes (`) as exec strings in -scripting 
mode; if mixed, --language=es6 takes precedence over -scripting, 
ES5+scripting is unaffected.

Outstanding correctness issues not dealt with:
* 12.2.9.3 GetTemplateObject stipulates that the returned template 
object be cached and unique. I don't know why you'd want the spec to 
demand caching rather than allow it (functionally it does not make a 
difference, but you could observe it not being cached in a test).
* 12.2.9.5 Evaluation: string concatenation using + is slightly 
off-spec. There are two way to solve this: (a) wrap the expressions in a 
ToString UnaryExpression (or RuntimeCall) or (b) generate a call to 
concat with interleaved string and expression arguments.

Testing: ant -f make/build.xml test-pessimistic test-optimistic

Thanks,
Andreas


More information about the nashorn-dev mailing list