Updating.
> On Nov 16, 2022, at 5:41 PM, Alex Buckley <alex.buck...@oracle.com> wrote:
>
> The first line says StringTemplates, should say StringTemplate.
>
> The paragraph about the `process(ValidatingProcessor)` method is confusing --
> it's not an alternative to using template expressions if the example needs to
> show a template expression before invoking `process`. I think you mean to say
> something about supporting deferred evaluation of a template expression, in
> conjunction with the RAW processor?
>
> The implNote: "Libraries may produce StringTemplate instances as long as they
> conform to the requirements of this interface." -- there's no need to say
> this if the requirements (e.g. for immutability) are spelled out in the
> normative specs (keep reading).
>
> The immutability of lists returned from `fragments()` and `values()` is
> mentioned both in the user-level spec ("Returns this StringTemplate's
> immutable list ...") and in the implementer-level spec ("The list returned is
> immutable."). That's a recipe for confusion. Better to drop the @implNote and
> commit to immutability as core to the method's result:
>
> ---
> Returns a list of the fragment literals for this StringTemplate.
>
> The fragment literals are the character sequences preceding each of the
> embedded expressions in source code, plus the character sequence following
> the last embedded expression. Such character sequences may be zero-length if
> an embedded expression appears at the beginning or end of a template, or if
> two embedded expressions are directly adjacent in a template.
>
> The list is immutable. [I'm not sure why this is important, but OK.]
> ---
>
> The spec of the `interpolate` method has a stray dot and an example which
> calls `interpolation()`. Please rename `string` to `result`. Say: @return A
> string denoting the interpolation of this `StringTemplate`'s fragments and
> values.
>
> Alex
>
> On 11/16/2022 12:06 PM, Jim Laskey wrote:
>> CSR and available docs have been changed to reflect these changes.
>> https://cr.openjdk.java.net/~jlaskey/templates/docs/api/java.base/java/lang/template/StringTemplate.html
>>
>> <https://cr.openjdk.java.net/~jlaskey/templates/docs/api/java.base/java/lang/template/StringTemplate.html>
>> Cheers,
>> — Jim
>>> On Nov 16, 2022, at 3:10 PM, Alex Buckley <alex.buck...@oracle.com
>>> <mailto:alex.buck...@oracle.com>> wrote:
>>>
>>> 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>
>>>> <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>
>>>> <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>
>>>> <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://openjdk.org/jeps/430 <https://openjdk.org/jeps/430>>
>>>> https://bugs.openjdk.org/browse/JDK-8273943
>>>> <https://bugs.openjdk.org/browse/JDK-8273943>
>>>> <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>
>>>> <https://bugs.openjdk.org/browse/JDK-8296302
>>>> <https://bugs.openjdk.org/browse/JDK-8296302>>
>>>> Thank you.
>>>> Cheers,
>>>> — Jim