On Wed, 25 May 2022 20:55:21 GMT, Jonathan Gibbons <j...@openjdk.org> wrote:

>> As described in the JBS issue, the observed problem is a side-effect of a 
>> related but different issue, which is that record classes are not treated 
>> the same was as enum classes when it comes to generating the class hierarchy 
>> in `ClassTree`. Because record classes are not treated 
>> specially/differently, they are treated as ordinary/plain classes, with the 
>> side-effect that the page for `java.lang.Record` shows `Direct Known 
>> Subclasses`.
>> 
>> The underlying fix is therefore to clone the enum support in `ClassTree` and 
>> related classes, to provide support for record classes. It is possible to do 
>> an extreme minimal clone, but that just clones some of the messy evolution 
>> already there. Instead, the code in `ClassTree` and its clients is 
>> refactored and modernized.
>> 
>> Previously there were four explicit pairs of member fields, containing data 
>> for different groups (hierarchies) of classes, namely: plain classes, enum 
>> classes, interfaces and annotation interfaces. These fields are most of the 
>> code to support them are moved into some new abstractions to encapsulate 
>> related functionality.
>> 
>> 1. The main new abstraction in `ClassTree` is `Hierarchy` which provides the 
>> support for the different hierarchies displayed in the generated pages.
>> 2. A new enum `HierarchyKind` identifies the four existing hierarchies 
>> (listed above) and now a new one, for record classes. The hierarchies 
>> correspond to the different kinds of declared type.
>> 3. A small new class `SubtypeMap` which is a multi-map for mapping a type 
>> element to its subtypes.  This is used in `Hierarchy` and to record the 
>> classes that implement an interfaces.
>> 
>> Generally, the naming should be clearer and more obvious. The most confusing 
>> name in the old code was `enumSubtypes` which was weird because enum classes 
>> don't have subtypes.  It meant "subtypes of supertypes of enum classes". 
>> This was a prime motivator to switch to the `hierarchy` terminology.   The 
>> variant spellings of `intfacs` have all been replaced  by `interfaces`, and 
>> `classtree` becomes `classTree`.
>> 
>> *Testing*: a new test case has been added to the `TestRecordTypes.java` 
>> test, which verifies the new record hierarchy is displayed on a a package 
>> tree page.  It is not simple to directly test the observed/reported 
>> behavior, because it is specific to the JDK API documentation, and because 
>> it is about the content of the `java.lang.Record` API page. However, manual 
>> inspection and diff comparison between JDK API documentation generated 
>> before and after this change reveals only expected differences. These 
>> differences are on the `java.lang.R4cord` page (where the offending section 
>> is no longer displayed) and on the pages related to the two existing records 
>> in JDK ... which are now listed in `Record Class Hierarchy` sections in the 
>> appropriate `package-tree.html` files.
>
> Jonathan Gibbons has updated the pull request with a new target base due to a 
> merge or a rebase. The pull request now contains five commits:
> 
>  - Merge remote-tracking branch 'upstream/master' into 8285939.record-subtypes
>  - address review comments: add doc comments to new methods
>  - merge with upstream master
>  - fix copyright; update test description
>  - JDK-8285939: javadoc java.lang.Record should not have "Direct Known 
> Subclasses:" section

Looks good.

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassTree.java
 line 78:

> 76:         /**
> 77:          * {@return the roots of the hierarchy}
> 78:          * The roots are the classes or interfaces with no superclass or 
> superinterfaces.

Use singular "root" for clarity:
Suggestion:

         * A root is a class or an interface with no superclass or 
superinterfaces.

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassTree.java
 line 88:

> 86:          * {@return a map containing the type elements in this hierarchy 
> and their subtypes}
> 87:          */
> 88:         public Map<TypeElement, SortedSet<TypeElement>> subtypes() {

This method is unused; consider deleting it.

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassTree.java
 line 103:

> 101:          * {@return the set of all subtypes of the given type element, 
> or an empty set if there are none}
> 102:          *
> 103:          * The set of all subtypes is the transitive closure of the 
> {@linkplain #subtypes() immediate subtypes}

Did you mean to link to #subtypes(TypeElement)?

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassTree.java
 line 128:

> 126:     /**
> 127:      * A map giving the subtypes for each of a collection of type 
> elements.
> 128:      * The subtypes may be subclasses or subinterfaces, depending on the 
> context.

For a separate PR: we should consider dropping hyphens from "super-" and "sub-" 
in words that relate to classes, interfaces, types, and packages.

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/ClassTree.java
 line 228:

> 226: 
> 227:     /**
> 228:      * Generate the hierarchies for the given set of type elements.

Suggestion:

     * Generate the hierarchies for the given type elements.

test/langtools/jdk/javadoc/doclet/testRecordTypes/TestRecordTypes.java line 610:

> 608: 
> 609:     @Test
> 610:     public void testPackageTree(Path base) throws IOException {

Am I right saying that we cannot easily test the original bug symptom, which is 
the presence of "Direct Known Subclasses:" on the 
api/java.base/java/lang/Record.html page?

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

Marked as reviewed by prappo (Reviewer).

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

Reply via email to