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