The doclet "comment inheritance algorithm" spec conformance
I Al Istannen
java-ml at ialistannen.de
Tue Feb 6 15:14:23 UTC 2024
Hey,
I hope this is the right place to ask :)
I was recently implementing javadoc comment inheritance for spoon[0] and
verified it against IntelliJ IDEA and the standard html doclet. While
doing this I found out that IntelliJ and the standard doclet disagree on
comment inheritance in this example[1]. The doclet algorithm documented
in [2] specifies the following:
1. Look in each directly implemented (or extended) interface in the
order they appear following the word implements (or extends) in the
type declaration. /Use the first documentation comment found for
this method./
2. If Step 1 failed to find a documentation comment, then recursively
apply this entire algorithm to each directly implemented (or
extended) interface in the same order they were examined in Step 1.
This seems to imply that resolution proceeds in two phases. First, you
look at the direct super interfaces and see if any doc comment there
contains what you need. If this does not result in a value /after/
looking at /all/ super interfaces, you try finding it recursively in
each super interface, again in declaration order.
If we now apply this to find the body in the example[1]:
1. Look at the javadoc in SuperInt2, find no body
2. Look at the javadoc in SuperInt3, find the body
"Neverused,shadowedbybodyinsuperint1."
3. Return this value. Body is now "Neverused,shadowedbybodyinsuperint1."
This is the behaviour you can observe in IntelliJ IDEA, as they split
this logic into two distinct phases[3]. It is, however, not the
behaviour of the standard doclet. The standard doclet finds the body
"Atest." declared in SuperInt1, which SuperInt2 extends from. After
glancing at the doclet source code, the doclet seems to /directly/
explore the full inheritance hierarchy for every superinterface by doing
a depth-first search[4], effectively interleaving step 1 and 2.
I was whipping up a patch for IntelliJ, but I am actually not sure it is
wrong. My spoon resolver code mirrors the JDK code by pure coincidence,
but I think the spec agrees with IntelliJ here. Is this a bug in the
standard doclet, is the specification outdated/wrong or did I miss
something?
Have a nice day!
I Al Istannen
[0] https://github.com/INRIA/spoon/,
https://github.com/INRIA/spoon/blob/master/spoon-javadoc/src/main/java/spoon/javadoc/api/parsing/InheritanceResolver.java
[1] https://gist.github.com/I-Al-Istannen/a95125d20319a999d2255a7fe086e768
[2]
https://docs.oracle.com/en/java/javase/21/docs/specs/javadoc/doc-comment-spec.html
[3]
https://github.com/JetBrains/intellij-community/blob/4f20bcc65cd08c53e4734bbe302480eb9b31515d/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java#L3076
[4]
https://github.com/openjdk/jdk/blob/e9d19d0fffc47119d0d4f756833ec87cd0a6331e/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java#L2832
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/javadoc-dev/attachments/20240206/77064d9c/attachment.htm>
More information about the javadoc-dev
mailing list