On Mon, 4 Apr 2022 23:46:57 GMT, Jonathan Gibbons <j...@openjdk.org> wrote:

> This is a redo of a recent fix, which passed all tier1 tests but broke "make 
> docs".
> 
> The reason for the crash was a combination of a number of factors, such that 
> fixing any one (or more) would make the problem go away, making it hard(er) 
> to determine the correct path forward.
> 
> 1. In a doc comment in JDK code, the author had mistakenly written a number 
> of tags like `{@link byte}` instead of `{@code byte}` and `{@link byte[]}` 
> instead of `{@code byte[]}`
> 
> 2. `DocTrees.getElement` returns the javac-internal symbol for primitive 
> types (instead of `null`) and the base type for arrays. So for both `{@link 
> byte}` and `{@link byte[]}` the `LinkFactory` was given a javac-internal 
> symbol (instead of null).  Filed as JDK-8284315.
> 
> 3. Thinking the value was a declared type, and so in a named or unnamed 
> package, the `LinkFactory` attempts to create a link based on the package of 
> the value.    The package for the java-internal symbols for primitive type is 
> a special `rootPackage` which has no equivalent in the Language Model world, 
> and which has a `null` owner.
> 
> 4. The new code in `JavacElements.getModuleOf` assumes that (as is generally 
> standard in javac) all symbols have a non-`null` owner, this giving an NPE 
> when called with `rootPackage`.
> 
> So, there are various possible ways to fix this.
> 
> 1. put a broad null check for `sym.owner` in `JavacElements.getModuleOf`
> 2. put a specific check for `rootPackage` in `JavacElements.getMOduleOf`
> 3. fix `DocTrees.getElement` to not return javac-internal symbols
> 4. change javadoc to workaround the issue with `DocTrees.getElement`
> 5. fix the javadoc comments to not use bad forms, like `{@link byte}` etc.
> 
> 1 and 2 would both be atypical idioms in the code.
> 
> 3 is desirable, but may cause additional work/updates/etc. It would be a 
> change to the behavior of a public API, and so compatibility concerns would 
> need to be addressed, although arguably the change in behavior is a bug fix, 
> not a spec change. (The current behavior is under-specified!)
> 
> By itself, 5 would just be ignoring the underlying problem.
> 
> That leaves 4, which is the solution adopted here. It localizes the 
> change/check to javadoc internal code. It is an interim measure until we can 
> fix 3. (JDK-8284315)
> 
> * The javac part of the fix is essentially the same as before (a redundant 
> import has been removed, this time.)  By itself the code was not wrong, when 
> used as intended.
> 
> * `DocTrees.getElement` is called from a single place in javadoc, in 
> `CommentHelper` and so a check is made on the result such that `null` is 
> returned when the result would otherwise not be a declared type.
> 
> * A new (javadoc) test is added to verify the new behavior for `{@link byte}` 
> etc. The prior behavior (even before the original fix) was to display the 
> type in monospace font.  The new behavior is for javadoc to fall back on the 
> recently-new mechanism to display a "invalid tag" block.
> 
> With these fixes, "make docs" works, and does not crash(!) Comparing the 
> result of "make docs" before and after this fix, the only significant 
> differences arise from the 5 bad `{@link ...}` tags in `MemorySegment.java`. 
> These should (separately) be fixed.

the compiler changes look good to me

-------------

Marked as reviewed by vromero (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/8101

Reply via email to