RFR: 8300517: Refactor VisibleMemberTable (method members) [v2]

Jonathan Gibbons jjg at openjdk.org
Thu Mar 9 19:43:42 UTC 2023


On Wed, 8 Mar 2023 14:42:46 GMT, Pavel Rappo <prappo at openjdk.org> wrote:

>> src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java line 649:
>> 
>>> 647:             assert te.getKind().isClass();
>>> 648:             VisibleMemberTable vmt = configuration.getVisibleMemberTable(te);
>>> 649:             for (Element e : vmt.getMembers(VisibleMemberTable.Kind.METHODS)) {
>> 
>> In similar situations, I have found it useful to pass in a type token that determines the result type and which avoids casting the returned objects:
>> 
>> For example:
>> 
>>    <T> List<T extends Element> getMembers(VisibleMemberTable.Kind k, Class<T> clazz)
>
> Unfortunately, there's no such thing as generic enum, which would be just the ticket here.
> 
> Type token would be okay, but perhaps only marginally better than what we have now: neither option supports static checking. Anyhow, we might revisit it in the next round of refactoring, not now.

OK, with not now, but I do think the type token is marginally better than a cast of the result at the use site.

>> src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java line 1031:
>> 
>>> 1029:         // TODO: this computation should be eventually delegated to VisibleMemberTable
>>> 1030:         Set<TypeElement> alreadySeen = null;
>>> 1031:         assert (alreadySeen = new HashSet<>()) != null; // create set conditionally
>> 
>> I think this use of `assert` (here and lower down) is a step too far.  It's one thing to use asserts to verify invariants; it's too much to use them to conditionally compute state like this.
>
> That hash map is needed iff assertions are enabled. For an ordinary run, creating that hash map could be wasteful.
> 
> Perhaps I could create a hash map unconditionally using `HashMap.newHashMap(0)`; would that be to your liking?

The issue was more about the composite declaration and use of the asserts to build a collection solely for use in the assertions. This is a level of assert above simply checking invariants with no other side effects on the JVM.  The use is clever and not wrong, but it is uncommon.  Maybe a higher level comment might help, more than the low level "create set conditionally"

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

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


More information about the javadoc-dev mailing list