On Tue, 21 Sep 2021 22:20:07 GMT, Jonathan Gibbons <j...@openjdk.org> wrote:

>> Please review a medium size update/overhaul to the way that positions and 
>> diagnostic positions are handled in the `DocTree`/`DCTree` world.
>> 
>> ## Previously ...
>> 
>> Previously, most `DCTree` nodes only had an explicit "position" (`pos`). 
>> Start and end positions were provided by `DocSourcePositions`, but these 
>> were not directly available in tree nodes, because of the lack of access to 
>> the `DocSourcePositions` class.  (In contrast, `JCTree` nodes do have 
>> position info, via static methods in `TreeInfo`.)  The one notable exception 
>> to these guidelines was `DCErroneous` which (by analogy with `JCTree`) 
>> directly implemented `JCDiagnostic.DiagnosticPosition` but that was an 
>> arguably bad implementation because the positions were relative to the start 
>> of the comment, and not the start of the file. This did not show up in code 
>> and tests, because diagnostics related to `DocTree` nodes used `DCTree.pos` 
>> which returned a `SimpleDiagnosticPosition` referencing just the start 
>> position -- at least in part because more specific information was not 
>> easily available.
>> 
>> ## Now ... 
>> 
>> All `DCTree` nodes have 4 positions, 3 publicly available.
>> * the position of the first unique character, `pos`
>> * the starting position of the range of characters, `getStartPosition()`
>> * the "preferred" position in the range, used to position the caret in 
>> diagnostic messages, `getPreferredPosition()`
>> * the end position of the range of characters, `getEndPosition()`.
>> These are all relative to the beginning of the comment text, and are 
>> converted to file positions as needed.
>> 
>> Code to implement the end position is moved from `JavacTrees` to `DCTree`. 
>> It's still a switch on kind, but could reasonably be converted to using 
>> overriding methods.
>> 
>> `DCErroneous` no longer implements `JCDiagnostic.DiagnosticPosition`. the 
>> constructor methods to create a diagnostic are removed, in favor of passing 
>> in a correctly-formed diagnostic.
>> 
>> `DCTree` has a new improved `pos(DCDocComment)` method which now uses the 
>> new start/pref/end position methods.
>> 
>> `DocCommentParser.ParseException` and the `erroneous` method now take an 
>> optional "pos" parameter to allow the position of an error to be more 
>> accurately specified.
>> 
>> ## Testing ...
>> 
>> Up until the point at which `DCTree.pos` was modified, all tests passed 
>> without change.   When `DCTree.pos()` was modified, a few (3) doclint tests 
>> starting failing, demonstrating a latent reliance of the old form of 
>> `DCTree.pos()`. These tests are updated.
>> 
>> Rather than write a single new test, the existing `DocCommentTester` class 
>> is updated to include a new `Checker`  which, generally, checks the "left to 
>> right" nature of all positions in a doc comment tree and its subtrees. This 
>> leverages all the existing good and bad test cases in the 
>> `tools/javac/doctree` directory, which therefore all get tagged with the bug 
>> number for this issue.
>> 
>> ## Behavior ...
>> 
>> Apart from fixing generally bad behavior, there is one other tiny behavioral 
>> change. For an empty `DocCommentTree` the ending position is now the same at 
>> the starting position, and not `NOPOS`.  This was triggered by the new code 
>> in `DocCommentTester`, but which affected one `jshell` test, which started 
>> getting `StringIndexOutOfBounds` exception. This is minimally fixed for now, 
>> but the code in question would arguably be better to use the new 
>> comment-based positions, rather than the file-based positions. But that 
>> seems out of scope for this work.  Also worth investigating is the method 
>> `JavacTrees.getDocCommentTree(FileObject fileObject)` which uses a fixed 
>> offset of 0 (JavacTrees, line 1052) when creating doc comments for HTML 
>> files.
>
> Jonathan Gibbons has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   revert unrelated debug edit

As this PR contains a lot clean-up changes and improvements, it will take me 
extra time to review it. Here's the first batch of comments.

src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java line 269:

> 267:                     DCTree dcTree = (DCTree) tree;
> 268:                     if 
> (dcComment.getSourcePosition(dcTree.getEndPosition()) == 0) {
> 269:                         System.err.println("WARNING: comment:" + 
> dcComment.comment + ": " + dcTree.getKind() + " end:" + 
> dcTree.getEndPosition() + " result: " + 
> dcComment.getSourcePosition(dcTree.getEndPosition()));

This looks like a leftover debugging aid.

src/jdk.compiler/share/classes/com/sun/tools/javac/parser/DocCommentParser.java 
line 971:

> 969:     /**
> 970:      * Creates an {@code ErroneousTree} node, for a range of text 
> starting at a given position,
> 971:      * ending at the last non-white character before the current 
> position,

In this file and in JDK overall, such characters as predominantly called 
"non-whitespace".

src/jdk.compiler/share/classes/com/sun/tools/javac/parser/DocCommentParser.java 
line 985:

> 983:     /**
> 984:      * Creates an {@code ErroneousTree} node, for a range of text 
> starting at a given position,
> 985:      * ending at the last non-white character before the current 
> position,

ditto

src/jdk.compiler/share/classes/com/sun/tools/javac/parser/DocCommentParser.java 
line 986:

> 984:      * Creates an {@code ErroneousTree} node, for a range of text 
> starting at a given position,
> 985:      * ending at the last non-white character before the current 
> position,
> 986:      * and with a given preferred position

Add full stop.

src/jdk.compiler/share/classes/com/sun/tools/javac/parser/ReferenceParser.java 
line 124:

> 122:             moduleName = switch (slash) {
> 123:                 case -1 -> null;
> 124:                 case 0 -> throw new ParseException(0, 
> "dc.ref.syntax.error");

There's a slight change in error output. Although it is likely insignificant, I 
felt I should note it. For example, compare the error output for `{@link 
//java.lang.Object}`.

src/jdk.compiler/share/classes/com/sun/tools/javac/tree/DCTree.java line 74:

> 72:  * </ul>
> 73:  *
> 74:  * All are values relative to the beginning of the

Transposition error? "All values are relative..."

src/jdk.compiler/share/classes/com/sun/tools/javac/tree/DCTree.java line 88:

> 86:     /**
> 87:      * The position of the first character that is unique to this node.
> 88:      * It is normally set by the methods in {@link DocTreeMaker}.

Since this change also includes cleanup, we might as well fix "the the" and 
"non-white space" at DocTreeMaker.java:699.

src/jdk.compiler/share/classes/com/sun/tools/javac/tree/DCTree.java line 161:

> 159:         }
> 160: 
> 161:         switch (getKind()) {

This switch might become even better after "Pattern Matching for switch" has 
been integrated (currently in preview, JEP 406).

src/jdk.compiler/share/classes/com/sun/tools/javac/tree/DCTree.java line 265:

> 263:      * {@return a diagnostic position based on the positions in a 
> comment}
> 264:      *
> 265:      * The positions are lazily converted to file-based positions as 
> needed.

"lazily" somewhat duplicates "as needed", no?

test/langtools/tools/javac/doctree/SerialTest.java line 26:

> 24: /*
> 25:  * @test
> 26:  * @bug 7021614 8273244 8273244

Duplicating bug IDs.

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

PR: https://git.openjdk.java.net/jdk/pull/5510

Reply via email to