RFR: JDK-8285932 Implementation of JEP-430 String Templates (Preview) [v7]
Jorn Vernee
jvernee at openjdk.org
Wed Nov 2 19:24:40 UTC 2022
On Mon, 31 Oct 2022 20:11:34 GMT, Jim Laskey <jlaskey at openjdk.org> wrote:
>> Enhance the Java programming language with string templates, which are similar to string literals but contain embedded expressions. A string template is interpreted at run time by replacing each expression with the result of evaluating that expression, possibly after further validation and transformation. This is a [preview language feature and API](http://openjdk.java.net/jeps/12).
>
> Jim Laskey has updated the pull request incrementally with one additional commit since the last revision:
>
> Add @SafeVarargs declarations
src/java.base/share/classes/java/lang/runtime/TemplateSupport.java line 74:
> 72:
> 73: /**
> 74: * Static final processor.
Suggestion:
* final processor.
src/java.base/share/classes/java/lang/runtime/TemplateSupport.java line 141:
> 139: MethodType processorGetterType = MethodType.methodType(ValidatingProcessor.class);
> 140: ValidatingProcessor<?, ?> processor =
> 141: (ValidatingProcessor<?, ?>)processorGetter.asType(processorGetterType).invokeExact();
Essentially the same as:
Suggestion:
ValidatingProcessor<?, ?> processor = (ValidatingProcessor<?, ?>)processorGetter.invoke();
src/java.base/share/classes/java/lang/runtime/TemplateSupport.java line 184:
> 182: MethodHandle mh = MethodHandles.insertArguments(DEFAULT_PROCESS_MH, 0, fragments, processor);
> 183: mh = mh.withVarargs(true);
> 184: mh = mh.asType(type);
I suggest doing:
Suggestion:
mh = mh.asCollector(Object[].class, type.parameterCount());
mh = mh.asType(type);
Instead, as it is more straightforward in terms of the code that gets called. (the impl of `withVarargs` + `asType` does the same thing in a more roundabout way).
src/java.base/share/classes/java/lang/template/ProcessorLinkage.java line 60:
> 58: * @throws NullPointerException if any of the arguments are null
> 59: */
> 60: MethodHandle linkage(List<String> fragments, MethodType type);
I suggest changing the protocol here to be able to take all bootstrap arguments into account, and return a `CallSite` instead. That will allow a `ProcessorLinkage` to take the lookup and name into account as well, and allows returning e.g. a `MutableCallSite` as well.
Maybe this can still be changed later as well though, since the interface is sealed.
src/java.base/share/classes/java/lang/template/StringTemplate.java line 103:
> 101: * // check or manipulate the fragments and/or values
> 102: * ...
> 103: * String result = StringTemplate.interpolate(fragments, values);;
Suggestion:
* String result = StringTemplate.interpolate(fragments, values);
src/java.base/share/classes/java/lang/template/StringTemplate.java line 117:
> 115: */
> 116: @PreviewFeature(feature=PreviewFeature.Feature.STRING_TEMPLATES)
> 117: public interface StringTemplate {
What is the reason for having this open to extension? Rather than just being a final class or sealed interface?
(I think it is so that implementations can provide a more efficient layout rather than using Lists?)
src/java.base/share/classes/java/lang/template/StringTemplate.java line 246:
> 244: Objects.requireNonNull(stringTemplate, "stringTemplate should not be null");
> 245: return Objects.hashCode(stringTemplate.fragments()) ^
> 246: Objects.hashCode(stringTemplate.values());
Could also (which is also `null` safe):
Suggestion:
return Objects.hash(stringTemplate.fragments(), stringTemplate.values());
src/java.base/share/classes/java/lang/template/ValidatingProcessor.java line 149:
> 147: @PreviewFeature(feature=PreviewFeature.Feature.STRING_TEMPLATES)
> 148: @FunctionalInterface
> 149: public interface ValidatingProcessor<R, E extends Throwable> {
I suggest moving the doc that gives an overview of the API here to the `package-info` file. The package-info file is a better place to provide an overview of the API I think. (that's what we do for `java.lang.foreign` as well: https://docs.oracle.com/en/java/javase/19/docs/api/java.base/java/lang/foreign/package-summary.html)
-------------
PR: https://git.openjdk.org/jdk/pull/10889
More information about the compiler-dev
mailing list