On Tue, 12 Apr 2022 21:57:33 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.
>
> Jonathan Gibbons has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   address review feedback

Marked as reviewed by prappo (Reviewer).

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

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

Reply via email to