On Tue, 18 May 2021 11:07:18 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> wrote:
> This patch allows Resolve to use more static diagnostic factories. Resolution > errors support generation of diagnostics. This generation is very flexible > and allows creating either a toplevel (error or warning) diagnostic, or a > nested (fragment) diagostic. To support this, many resolution diagnostics in > javac define some "overloads" in compiler.properties - e.g. > > > # 0: message segment > compiler.err.prob.found.req=... > # 0: message segment > compiler.misc.prob.found.req=... > # 0: message segment, 1: type, 2: type > compiler.warn.prob.found.req=... > > > To support switching from one diagnostic kind to another, this patch adds a > new method on `DiagnosticInfo`, namely `toType(DiagnosticType)`. The default > implementation of this method will simply check that the type is identical to > that of the current diagnostic info, and throw otherwise. > > This patch modifies the build-time step to construct diagnostic factories, so > that, whenever a diagnostic overload is detected, the `toType` method is > overridden, and the right constants/factories are returned/called depending > on the requested diagnostic type. For instance, the factory for the > `prob.found.req` key will look as follows in the generated code: > > > /** > * compiler.err.prob.found.req=\ > * incompatible types: {0} > */ > public static Error ProbFoundReq(Fragment arg0) { > return new Error("compiler", "prob.found.req", arg0) { > public JCDiagnostic.DiagnosticInfo > toType(JCDiagnostic.DiagnosticType kind) { > return switch (kind) { > case ERROR -> this; > case WARNING -> throw new AssertionError("Unsupported > kind: " + kind); > case FRAGMENT -> Fragments.ProbFoundReq(arg0); > case NOTE -> throw new AssertionError("Unsupported > kind: " + kind); > }; > } > }; > } > > > As you can see, the build time process correctly detects all diagnostic > overloads and generate some code to convert one diagnostic info to another. > Note that in this case, only two overloads are detected (`err` and `misc`), > given that `warn` has a different type comment so not, technically speaking, > an overload. > > With this support it is relatively easy to go back to Resolve and update most > of the resolution errors to use the generated factories. > > The only case I have not dealt with is the "cannot.resolve" diagnostic, which > has many variants: `{ var, method, generic method } x { location, no location > }`. To use the factories effectively here a change in the way the diagnostic > is structured is required, but doing so, while trivial, will cause many > change in the golden test files, so I held off these changes for now, and > will come back later to this. This pull request has been closed without being integrated. ------------- PR: https://git.openjdk.java.net/jdk/pull/4089