RFR: 8285488: Improve DocFinder [v4]

Pavel Rappo prappo at openjdk.org
Fri Oct 28 22:01:48 UTC 2022


On Fri, 28 Oct 2022 18:58:38 GMT, Jonathan Gibbons <jjg at openjdk.org> wrote:

>> Pavel Rappo has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains 49 commits:
>> 
>>  - refactor: improve error handling
>>  - refactor: clarify, reuse, simplify, clean up
>>  - refactor: pass Utils & BaseConfiguration to taglet
>>    
>>    This simplifies lots of methods. Later this could be done for other
>>    taglets too.
>>  - refactor: better code comments
>>  - refactor: add more relevant excerpts from JLS
>>  - fix: introduce more control to search
>>    
>>    This is done for the sake of `@throws`. Two convenience methods are
>>    added to assist migration from Optional with minimal change to
>>    DocFinder call sites.
>>    
>>    This solves 8295800: When searching documentation for an exception,
>>    don't jump over methods that don't mention that exception.
>>  - refactor: clean up ThrowsTaglet
>>  - Merge branch 'master' into HEAD
>>  - 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.
>>  - Merge branch 'master' into 8285488
>>  - ... and 39 more: https://git.openjdk.org/jdk/compare/628820f4...c2db1ae6
>
> src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/taglets/ThrowsTaglet.java line 578:
> 
>> 576:             // exceptions (i.e. Failure.ExceptionTypeNotFound | Failure.NotExceptionType),
>> 577:             // so we instantiate it with a general Failure. We then refine the specific
>> 578:             // exception being thrown, from the general exception we caught.
> 
> Really? Are you sure?  This is exactly why multi-catch was added.   Am I missing something here?

In that comment I'm talking specifically about exception-type type parameters. Consider this interface:

    public interface MyInterface {

        static <X extends Throwable> void m(...) throws X { }
    }
    
Now, you can instantiate `X` like this:

    MyInterface.<EOFException>m(...);

But if you want `m` to declare that it can throw two exceptions, you cannot instantiate `X` like this:

    MyInterface.<EOFException | FileNotFoundException>m(...);

Or like this:

    MyInterface.<EOFException, FileNotFoundException>m(...);

You have to provide one exception type. It can either be a common ancestor of `EOFException` and `FileNotFoundException`; for example, `IOException`, `Exception` or `Throwable`. Or you can pack your exceptions into something else as a cause.

Whatever you choose, you won't get transparency and compile-time checking similar to what you'd get if you had this:

    static void m(...) throws FileNotFoundException, EOFException { }

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

PR: https://git.openjdk.org/jdk/pull/10746


More information about the javadoc-dev mailing list