> On 30 Jan 2020, at 01:25, Jonathan Gibbons <[email protected]> 
> wrote:
> 
> Please review a moderately simple fix to a regression in the way that javadoc 
> handles doclint options.
> 
> The feature was introduced in JDK 8, and at that time, the doclet options 
> were accumulated in a list.
> 
> The regression was introduced when the standard doclet was rewritten in JDK 
> 9, and perhaps because of the introduction of other new doclint options, the 
> options were changed to accumulate in a map, with "last one wins" semantics 
> for like-named options. This is the root cause of this issue.

Right. Arguments of an option are keyed by the instance, of the XOption type,
that handles this option. Like-named options are handled by the same instance of
the XOption type. Hence, when two sets of like-named options' arguments are
keyed, one of these sets is effectively overwritten.

This didn't necessarily mean we needed to do away with the map, we could use
`merge` or similar. But I agree with this change. We should keep it simple.

Nit. Could you please remove these (now obsolete) imports?

    import java.util.LinkedHashMap;
    import java.util.Map;

> The fix is to revert to accumulating options in a list, as originally 
> intended. In addition, the detection of whether doclint should be enabled or 
> not is improved, compared to JDK 8, such that doclint is only enabled if 
> either specific groups or all groups are enabled. Previously, it would only 
> be disabled if just -Xdoclint:none was specified.

Yes, current behavior seems be short-circuited by a stand-alone occurrence of
"none" (i.e. "-Xdoclint:none"). The proposed behavior always parses arguments
to completion, left to right. Is it expected behavior? Does javac do the same?

On a related note. I seem to understand how this code works. Still, why not
delegate options processing to DocLint itself? Is it because javadoc only
accepts a *subset* of DocLint options (e.g. no access qualifiers), or there
are other reasons?

> The penance for not writing a better unit test in JDK 8 is to write a better 
> regression test now.

I think I dislike that the implementation package was added for the sake of
reusing the com.sun.tools.doclint.Messages.Group enum, but it is not that big
of a problem. It just makes the test "gray-box".

> One other test (added in JDK 9) was relying on the bug, and needed to be 
> updated.
> 
> In this changeset ...
> 
> HtmlConfiguration.java ... the collection is changed to a list
> 
> HtmlOptions ... the options are transformed into doclint options (as before) 
> and accumulated in the list, but only if they pass the initial check. There 
> is also some minor cleanup ... the option for -Xdocrootparent is moved out of 
> the group of doclint options, and some minor warnings highlighted by the IDE 
> were fixed.

Thanks for incremental improvements and miscellaneous cleanup!

  180    doclint.init(t, doclintOpts.toArray(new String[0]), false);

What was the reason for changing this?

> WorkArounds ... the primary change here is better analysis of the doclint 
> options to determine if doclint should be enabled. Comments are added, and 
> the "TODO: fix this up correctly" is removed ;-)
> 
> The new test uses a source file that will trigger different doclint 
> diagnostics, depending on which are enabled. It then runs javadoc with 
> different doclint options to verify that (just) the expected diagnostics are 
> generated.
> 
> -- Jon
> 
> 
> JBS: https://bugs.openjdk.java.net/browse/JDK-8236949
> Webrev: http://cr.openjdk.java.net/~jjg/8236949/webrev.00/

It would be nice if the original reporter could confirm this changeset solves
their issue (this email is CC'ed to them).

Looks good.

-Pavel



Reply via email to