On Wed, 22 Sep 2021 16:11: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:
> 
>   address preliminary review comments

src/jdk.compiler/share/classes/jdk/internal/shellsupport/doc/JavadocHelper.java 
line 498:

> 496:                             //the newline:
> 497:                             long endPos = sp.getEndPosition(null, 
> dcTree, tree);
> 498:                             if (endPos >= offset) {

What's that about?

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

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

Reply via email to