On Fri, 28 Oct 2022 16:33:11 GMT, Maurizio Cimadamore <[email protected]>
wrote:
>> Jim Laskey has updated the pull request incrementally with one additional
>> commit since the last revision:
>>
>> Move StringConcatItem to FormatConcatItem
>
> src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symtab.java line 631:
>
>> 629: stringTemplateType =
>> enterClass("java.lang.template.StringTemplate");
>> 630: templateRuntimeType =
>> enterClass("java.lang.template.TemplateRuntime");
>> 631: templateProcessorType =
>> enterClass("java.lang.template.ValidatingProcessor");
>
> Please give it a name that matches the corresponding class - this threw me
> off when looking at the type-checking code.
Renaming.
> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/ArgumentAttr.java
> line 106:
>
>> 104: private final Attr attr;
>> 105: private final Symtab syms;
>> 106: private final Types types;
>
> Why this change?
Renaming. Was residual to some context based typing (StringTemplate vs String)
Jan and I experimented with.
> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java line 4974:
>
>> 4972: if (processor != null) {
>> 4973: resultType = attribTree(processor, env, new
>> ResultInfo(KindSelector.VAL, Type.noType));
>> 4974: resultType = chk.checkProcessorType(processor, resultType,
>> env);
>
> It seems that if this check is erroneous, the type that is considered as
> returned by the processor is just `StringTemplate`. This seems odd - if we
> have issues type-checking and we get StringTemplate instead of some type T
> that the user expects, but doesn't get (e.g. because of raw types), there
> could be spurious error messages generated from a type mismatch between T and
> StringTemplate.
Not sure where you get `StringTemplate`. If you specify
`TemplateProcessor<String>` the `resultType` will be `String`. For example:
public class Processor implements TemplateProcessor<String> {
@Override
public String process(StringTemplate st) {
return st.interpolate();
}
}
and
public class Main {
public static void main(String... args) throws Throwable {
Processor processor = new Processor();
System.out.println(processor."1234");
}
}
works with "1234" as a result.
If you later change to
public class Processor implements TemplateProcessor<Integer> {
@Override
public Integer process(StringTemplate st) {
return Integer.valueOf(st.interpolate());
}
}
Then you get a `java.lang.ClassCastException` as you would expect.
> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Lower.java.orig line
> 1:
>
>> 1: /*
>
> This file shouldn't be here
oops - We should change the `.gitignore` to include `.orig` and `.rej`
> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java line
> 348:
>
>> 346: try {
>> 347: chk.disablePreviewCheck = true;
>> 348: String autoImports = """
>
> I see why you went down here. It is pragmatic, given we might add other stuff
> to the list. But it is mildly odd to see parser being called again from here,
> although harmless.
>
> What worries me more is the dance around enabling/disabling preview checks.
> Again, I see why you went there.
>
> As a possible alternative to disable preview checks globally, you could
> instead install a deferred log handler (see Log) class - so that all the
> diagnostics generated when following imports can be dropped on the floor. (we
> use this mechanism in DeferredAttr, to disable diagnostics during a deferred
> attribution step).
This was recommended by Jan and the procedure used in other parts of the code.
-------------
PR: https://git.openjdk.org/jdk/pull/10889