RFR of JDK-8285932 Implementation of JEP-430 String Templates (Preview)

Alex Buckley alex.buckley at oracle.com
Wed Nov 16 19:10:20 UTC 2022


Below, a revised description for `StringTemplate`.


// High-level opener.

`StringTemplate` is the run-time representation of a string template or 
text block template in a template expression.

[Sidebar. The JEP says "An instance of StringTemplate represents the 
string template or text block template that appears either as the 
template in a template expression, or as a standalone literal." -- the 
'standalone literal' clause should be deleted.]

// Basic concepts. No need to spell out details like immutability or 
return types here; leave them for the method specs.

In the source code of a Java program, a string template or text block 
template contains an interleaved succession of _fragment literals_ and 
_embedded expressions_. The `fragments()` method returns the fragment 
literals, and the `values()` method returns the results of evaluating 
the embedded expressions. `StringTemplate` does not provide access to 
the source code of the embedded expressions themselves; it is not a 
compile-time representation of a string template or text block template.

// Usage

`StringTemplate` is primarily used in conjunction with a template 
processor to produce a string or other useful value. Evaluation of a 
template expression first produces an instance of `StringTemplate`, 
representing the template of the template expression, and then passes 
the instance to the template processor given by the template expression.

For example, the following code contains a template expression that uses 
the template processor `RAW`, which simply yields the `StringTemplate` 
passed to it:

int x = 10;
int y = 20;
StringTemplate st = RAW."\{x} + \{y} = \{x + y}";
List<String> fragments = st.fragments();
List<Object> values    = st.values();

`fragments` will be equivalent to `List.of(" + ", " = ")` and `values` 
will be the equivalent of `List.of(10, 20, 30)`.

The following code contains a template expression with the same template 
but a different template processor:

int x = 10;
int y = 20;
String s = STR."\{x} + \{y} = \{x + y}";

When the template expression is evaluated, an instance of 
`StringTemplate` is produced that returns the same lists from 
`fragments()` and `values()` as shown above. The `STR` template 
processor uses these lists to yield an interpolated string. `s` will be 
equivalent to `"10 + 20 = 30"`.

The `interpolate()` method provides a direct way to perform string 
interpolation of a `StringTemplate`. Template processors can use the 
following code pattern:

List<String> fragments = st.fragments();
List<Object> values    = st.values();
... check or manipulate the fragments and/or values ...
String result = StringTemplate.interpolate(fragments, values);

The `process(ValidatingProcessor)` method provides an alternative to 
using string template expressions.  [Sidebar. The example line of code 
which follows, is using a template expression. I'm not sure what was 
meant here.]

String result = RAW."\{x} + \{y} = \{x + y}".process(STR);

The factory methods `of(String)` and `of(List, List)` can be used to 
construct a `StringTemplate`.

@implNote: Implementations of `StringTemplate` must minimally implement 
the methods fragments() and values(). Instances of `StringTemplate` are 
considered immutable. To preserve the semantics of string templates and 
text block templates, the list returned by `fragments()` must be one 
element larger than the list returned by `values()`.

@jls 15.8.6


Alex

On 11/16/2022 4:49 AM, Jim Laskey wrote:
> May I get a final  (PR) review of JDK-8285932 Implementation of JEP-430 
> String Templates (Preview) from core-libs and compiler.
> 
> PR: https://github.com/openjdk/jdk/pull/10889 
> <https://github.com/openjdk/jdk/pull/10889>
> 
> 
> JBS: https://bugs.openjdk.org/browse/JDK-8285932 
> <https://bugs.openjdk.org/browse/JDK-8285932>
> CSR: https://bugs.openjdk.org/browse/JDK-8286021 
> <https://bugs.openjdk.org/browse/JDK-8286021>
> JEP: https://openjdk.org/jeps/430 <https://openjdk.org/jeps/430> 
> https://bugs.openjdk.org/browse/JDK-8273943 
> <https://bugs.openjdk.org/browse/JDK-8273943>
> SPEC: https://bugs.openjdk.org/browse/JDK-8296302 
> <https://bugs.openjdk.org/browse/JDK-8296302>
> 
> Thank you.
> 
> Cheers,
> 
> — Jim
> 
> 


More information about the compiler-dev mailing list