On Thu, 4 Apr 2024 12:28:23 GMT, Pavel Rappo <pra...@openjdk.org> wrote:

>> Creating a link to a constructor or a method or comparing constructors or 
>> methods __does not__ factor in type parameters. When constructors or methods 
>> are overloaded and differ only in type parameters -- a situation which is 
>> absent in JDK API, but present elsewhere -- that causes significant defects, 
>> such as:
>> 
>>   - missing entries in summary tables, lists and indexes,
>>   - duplicating links in the table of contents.
>> 
>> This PR fixes those defects, and the fix is two-fold. Firstly, we update 
>> comparators to consider type parameters. That takes care of missing 
>> constructors and methods. Secondly, we update id (anchor) and link 
>> generation to always use the "erased" notation. That takes care of 
>> duplicating links.
>> 
>> What's the "erased" notation? Suppose we have the following method:
>> 
>>     <T extends String> T m(T arg)
>> 
>> The current notation refers to it as `m(T)`. That works fine until there's 
>> no other method, such as
>> 
>>     <T> T m(T arg)
>> 
>> In which case, the current notation will produce a collision: `m(T)`. By 
>> contrast, the erased notation for those two methods is `m(java.lang.String)` 
>> and `m(java.lang.Object)` respectively. No collision.
>> 
>> While longer, I believe that the erased notation is collision-proof. Why? 
>> Because [JLS 8.4.2][] says that "it is a compile-time error to declare two 
>> methods with override-equivalent signatures in a class". Which means that 
>> for any two constructors or methods the erasure of their signatures must 
>> differ, or else it won't compile.
>> 
>> The change is pretty straightforward, except for some test fallout that 
>> required attention.
>> 
>> [JLS 8.4.2]: 
>> https://docs.oracle.com/javase/specs/jls/se22/html/jls-8.html#jls-8.4.2
>
> Pavel Rappo has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   Respond to feedback

Some questions ...

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/ConstructorWriter.java
 line 200:

> 198:         content.add(heading);
> 199:         return HtmlTree.SECTION(HtmlStyle.detail, content)
> 200:                 .setId(memberAnchor);

It's a bit disappointing that more of this isn't in `HtmlIds`.
It feels like it perpetuates the original ugly code.

Would it make sense for `htmlIds` to return a record/pair containing both the 
`memberId` and `erasureId` for `ExecutableElement` ?

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/HtmlIds.java
 line 567:

> 565:         var methods = 
> vmt.getVisibleMembers(VisibleMemberTable.Kind.METHODS);
> 566:         // for whatever reason annotation methods are not of Kind.METHODS
> 567:         var otherMethods = 
> vmt.getVisibleMembers(VisibleMemberTable.Kind.ANNOTATION_TYPE_MEMBER);

I'm surprised you need to worry about annotation type members here -- 
annotation types cannot have type arguments, and so the "simple" id should 
always be sufficient.

src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/MethodWriter.java
 line 211:

> 209:         if (erasureAnchor != null
> 210:                 && !erasureAnchor.name().equals(memberAnchor.name())) {
> 211:             heading.setId(erasureAnchor);

See earlier comment about returning these together.

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

PR Review: https://git.openjdk.org/jdk/pull/18519#pullrequestreview-1980858688
PR Review Comment: https://git.openjdk.org/jdk/pull/18519#discussion_r1552261527
PR Review Comment: https://git.openjdk.org/jdk/pull/18519#discussion_r1552242033
PR Review Comment: https://git.openjdk.org/jdk/pull/18519#discussion_r1552262881

Reply via email to