RFR: 8285488: Improve DocFinder [v3]
Jonathan Gibbons
jjg at openjdk.org
Mon Oct 24 21:29:57 UTC 2022
On Wed, 19 Oct 2022 11:15:15 GMT, Pavel Rappo <prappo at openjdk.org> wrote:
>> Please have a look at this work-in-progress PR. The reason this is a (normal) PR rather than a more suitable draft PR is to mainly trigger a discussion on the mailing list on whether the suggested approach to solve multiple intertwined issues of exception documentation inheritance is a correct one.
>>
>> In a nutshell, it turns out that the combination of `{@throws}` and `{@inheritDoc}` is quite complex. It's more complex than a combination of `{@inheritDoc}` with any other tag or `{@inheritDoc}` on its own. To account for that complexity, handling of `{@inheritDoc}` in `{@throws}` is lifted to `ThrowsTaglet`.
>>
>> The said complexity stems from two facts:
>>
>> 1. Processing of `{@inheritDoc}` is context free and is done by replacing `{@inheritDoc}` with the tags it expands to. That model does not account for `@throws` where `{@inheritDoc}` sometimes expands to multiple `@throws` tags, which correspond to _separate_ entries in the "Throws:" section of a method detail. Read: we change the exception section, not a description of one of its entries.
>>
>> 2. Corresponding exception types in the hierarchy (i.e. matching `{@inheritDoc}` with exception documentation it must inherit) is not always clear-cut. This becomes especially apparent when type variables are involved.
>>
>> History
>> -------
>>
>> The work started as an attempt to fix JDK-8285488, hence the issue number for the PR. However, along its course the PR solved other issues, which will be soon added to the PR:
>>
>> * 8287796: Stop auto-inheriting documentation for subclasses of exceptions whose documentation is inherited
>> * 8291869: Match exceptions using types of `javax.lang.model`, not strings
>> * 8295277: Expand `{@inheritDoc}` in `@throws` fully
>> * 8288045: Clean up ParamTaglet
>> * 8288046: Clean up ThrowsTaglet
>>
>> As of today
>> -----------
>>
>> * All tests (both existing and newly introduced) pass.
>> * JDK API Documentation is the same, except for two files. In the first file, `docs/api/java.management.rmi/javax/management/remote/rmi/RMIConnectionImpl_Stub.html`, the order of exceptions has changed, which is insignificant. As for the second file, `docs/api/java.management/javax/management/MBeanServer.html`, the new warning is generated and erroneous input added to the corresponding page. The issue has to be addressed on the component side and is tracked by JDK-8295151.
>
> Pavel Rappo has updated the pull request incrementally with one additional commit since the last revision:
>
> fix: test failed due to filesystem handling issues
>
> Filed 8295543 to track that filesystem issue and fixed the test to make
> sure the package cannot be confused with the type parameter, whose
> name is not pertinent to the test anyway.
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/TagletWriterImpl.java line 835:
> 833: linkInfo.excludeTypeBounds = true;
> 834: var link = htmlWriter.getLink(linkInfo);
> 835: var concat = new ContentBuilder(HtmlTree.CODE(link));
hmmm, do you actually need the `CODE` here?
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/resources/standard.properties line 110:
> 108: doclet.see.nested_link=Tag {0}: nested link
> 109: doclet.throws.reference_not_found=cannot find exception type by name
> 110: doclet.throws.reference_bad_type=type found is not of exception type: {0}
suggest: `type is not an exception type` or even just `not an exception class`
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/resources/doclets.properties line 121:
> 119: doclet.UnknownTagLowercase={0} is an unknown tag -- same as a known tag except for case.
> 120: doclet.inheritDocWithinInappropriateTag=@inheritDoc cannot be used within this tag
> 121: doclet.inheritDocNoDoc=overridden methods do not document exception type {0}
we should check with Dan/Alex for the right terminology here; my best understanding is that we now use `exception class`. Bottom line, we should follow JLS.
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/InheritDocTaglet.java line 115:
> 113: + utils.flatSignature(method, writer.getCurrentPageElement());
> 114: messages.warning(method, "doclet.noInheritedDoc", signature);
> 115: }
Lines 99-115: would it help to refactor this to use an `instanceof` pattern?
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/InheritableTaglet.java line 32:
> 30:
> 31: import javax.lang.model.element.Element;
> 32: import java.util.List;
Elsewhere, we list Java (`java.*`, `javax.*`) imports first.
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/InheritableTaglet.java line 40:
> 38: public interface InheritableTaglet extends Taglet {
> 39:
> 40: Output inherit(Element owner, DocTree tag, boolean isFirstSentence, BaseConfiguration configuration);
It would be nice to have a javadoc comment describing this new method.
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ParamTaglet.java line 82:
> 80: Integer position = stringIntegerMap.get(ch.getParameterName(param));
> 81: if (position == null) {
> 82: return new Output(null, null, List.of(), true); // remodel, because it's an error
I'm not sure I understand the comment: is it some form of TODO?
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ReturnTaglet.java line 95:
> 93: }
> 94:
> 95: // TODO check for more than one @return
TODO
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ThrowsTaglet.java line 75:
> 73: public class ThrowsTaglet extends BaseTaglet implements InheritableTaglet {
> 74:
> 75: /*
Nice comment!
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ThrowsTaglet.java line 124:
> 122: * thrown exceptions and, hence, document them.
> 123: */
> 124:
Would it make sense to add a 3rd section about characteristics of `@throws` tags to be taken into account, citing issues like repeatability, subtypes, and inheritance?
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ThrowsTaglet.java line 234:
> 232: // one cannot practically use a list of tags cherry-picked from different doc comments)
> 233:
> 234: // This adds entries late; who starts an entry also ends it
Going forward (not here and now) we might want to generalize this. For example, given that `{@inheritDoc}` applies to just the body, and not all block tags, we might want to allow something like `@see {@inheritDoc}` to inherit all `@see` tags from its supertype, suggesting that the one-to-many relationship might need to be more general. (And no, I don't have any suggestion for selective `@see` inheritance.)
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ThrowsTaglet.java line 365:
> 363: var subtypeTestInapplicable = t.getKind() == TypeKind.EXECUTABLE
> 364: || t.getKind() == TypeKind.PACKAGE
> 365: || t.getKind() == TypeKind.MODULE;
Just asking ... would this be more concise as an enhanced switch expression?
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ThrowsTaglet.java line 464:
> 462: // exception jumping over methods that didn't
> 463: // document that exception to those methods
> 464: // that did. A method cannot "undocument"
agreed on "should probably not"
src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ThrowsTaglet.java line 516:
> 514: * The section is being built sequentially from top to bottom.
> 515: *
> 516: * Adapts one off methods of writer to continuous building.
"one off" should probably be hyphenated
-------------
PR: https://git.openjdk.org/jdk/pull/10746
More information about the javadoc-dev
mailing list