langtools/src/share/classes/com/sun/tools/javac/parser/JavadocTokenizer.java
author jjg
Mon, 08 Apr 2013 11:54:26 -0700
changeset 16810 670d880283e2
parent 15552 99e4c7eb352c
child 23113 5d44044f4f64
permissions -rw-r--r--
8011676: Instances of Tokens.Comment should not be defined in inner classes Reviewed-by: mcimadamore
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10815
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
     1
/*
15552
99e4c7eb352c 8007096: DocLint parsing problems with some comments
jjg
parents: 14541
diff changeset
     2
 * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
10815
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
     4
 *
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    10
 *
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    15
 * accompanied this code).
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    16
 *
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    20
 *
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    23
 * questions.
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    24
 */
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    25
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    26
package com.sun.tools.javac.parser;
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    27
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
    28
import com.sun.tools.javac.parser.Tokens.Comment;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
    29
import com.sun.tools.javac.parser.Tokens.Comment.CommentStyle;
10815
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    30
import com.sun.tools.javac.util.*;
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    31
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    32
import java.nio.*;
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    33
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    34
import static com.sun.tools.javac.util.LayoutCharacters.*;
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    35
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    36
/** An extension to the base lexical analyzer that captures
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    37
 *  and processes the contents of doc comments.  It does so by
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    38
 *  translating Unicode escape sequences and by stripping the
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    39
 *  leading whitespace and starts from each line of the comment.
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    40
 *
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    41
 *  <p><b>This is NOT part of any supported API.
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    42
 *  If you write code that depends on this, you do so at your own risk.
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    43
 *  This code and its internal interfaces are subject to change or
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    44
 *  deletion without notice.</b>
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    45
 */
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    46
public class JavadocTokenizer extends JavaTokenizer {
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    47
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    48
    /** Create a scanner from the input buffer.  buffer must implement
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    49
     *  array() and compact(), and remaining() must be less than limit().
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    50
     */
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    51
    protected JavadocTokenizer(ScannerFactory fac, CharBuffer buffer) {
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    52
        super(fac, buffer);
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    53
    }
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    54
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    55
    /** Create a scanner from the input array.  The array must have at
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    56
     *  least a single character of extra space.
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    57
     */
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    58
    protected JavadocTokenizer(ScannerFactory fac, char[] input, int inputLength) {
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    59
        super(fac, input, inputLength);
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    60
    }
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    61
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    62
    @Override
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
    63
    protected Comment processComment(int pos, int endPos, CommentStyle style) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
    64
        char[] buf = reader.getRawCharacters(pos, endPos);
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    65
        return new JavadocComment(new DocReader(fac, buf, buf.length, pos), style);
10815
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    66
    }
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    67
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    68
    /**
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
    69
     * This is a specialized version of UnicodeReader that keeps track of the
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    70
     * column position within a given character stream (used for Javadoc processing),
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    71
     * and which builds a table for mapping positions in the comment string to
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    72
     * positions in the source file.
10815
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
    73
     */
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    74
    static class DocReader extends UnicodeReader {
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
    75
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
    76
         int col;
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    77
         int startPos;
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
    78
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    79
         /**
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    80
          * A buffer for building a table for mapping positions in {@link #sbuf}
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    81
          * to positions in the source buffer.
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    82
          *
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    83
          * The array is organized as a series of pairs of integers: the first
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    84
          * number in each pair specifies a position in the comment text,
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    85
          * the second number in each pair specifies the corresponding position
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    86
          * in the source buffer. The pairs are sorted in ascending order.
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    87
          *
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    88
          * Since the mapping function is generally continuous, with successive
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    89
          * positions in the string corresponding to successive positions in the
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    90
          * source buffer, the table only needs to record discontinuities in
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    91
          * the mapping. The values of intermediate positions can be inferred.
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    92
          *
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    93
          * Discontinuities may occur in a number of places: when a newline
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    94
          * is followed by whitespace and asterisks (which are ignored),
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    95
          * when a tab is expanded into spaces, and when unicode escapes
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    96
          * are used in the source buffer.
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    97
          *
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    98
          * Thus, to find the source position of any position, p, in the comment
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
    99
          * string, find the index, i, of the pair whose string offset
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   100
          * ({@code pbuf[i] }) is closest to but not greater than p. Then,
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   101
          * {@code sourcePos(p) = pbuf[i+1] + (p - pbuf[i]) }.
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   102
          */
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   103
         int[] pbuf = new int[128];
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   104
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   105
         /**
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   106
          * The index of the next empty slot in the pbuf buffer.
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   107
          */
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   108
         int pp = 0;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   109
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   110
         DocReader(ScannerFactory fac, char[] input, int inputLength, int startPos) {
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   111
             super(fac, input, inputLength);
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   112
             this.startPos = startPos;
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   113
         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   114
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   115
         @Override
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   116
         protected void convertUnicode() {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   117
             if (ch == '\\' && unicodeConversionBp != bp) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   118
                 bp++; ch = buf[bp]; col++;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   119
                 if (ch == 'u') {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   120
                     do {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   121
                         bp++; ch = buf[bp]; col++;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   122
                     } while (ch == 'u');
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   123
                     int limit = bp + 3;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   124
                     if (limit < buflen) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   125
                         int d = digit(bp, 16);
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   126
                         int code = d;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   127
                         while (bp < limit && d >= 0) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   128
                             bp++; ch = buf[bp]; col++;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   129
                             d = digit(bp, 16);
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   130
                             code = (code << 4) + d;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   131
                         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   132
                         if (d >= 0) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   133
                             ch = (char)code;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   134
                             unicodeConversionBp = bp;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   135
                             return;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   136
                         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   137
                     }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   138
                     // "illegal.Unicode.esc", reported by base scanner
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   139
                 } else {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   140
                     bp--;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   141
                     ch = '\\';
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   142
                     col--;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   143
                 }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   144
             }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   145
         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   146
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   147
         @Override
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   148
         protected void scanCommentChar() {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   149
             scanChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   150
             if (ch == '\\') {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   151
                 if (peekChar() == '\\' && !isUnicode()) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   152
                     putChar(ch, false);
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   153
                     bp++; col++;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   154
                 } else {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   155
                     convertUnicode();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   156
                 }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   157
             }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   158
         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   159
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   160
         @Override
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   161
         protected void scanChar() {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   162
             bp++;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   163
             ch = buf[bp];
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   164
             switch (ch) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   165
             case '\r': // return
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   166
                 col = 0;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   167
                 break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   168
             case '\n': // newline
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   169
                 if (bp == 0 || buf[bp-1] != '\r') {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   170
                     col = 0;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   171
                 }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   172
                 break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   173
             case '\t': // tab
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   174
                 col = (col / TabInc * TabInc) + TabInc;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   175
                 break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   176
             case '\\': // possible Unicode
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   177
                 col++;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   178
                 convertUnicode();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   179
                 break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   180
             default:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   181
                 col++;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   182
                 break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   183
             }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   184
         }
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   185
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   186
         @Override
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   187
         public void putChar(char ch, boolean scan) {
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   188
             // At this point, bp is the position of the current character in buf,
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   189
             // and sp is the position in sbuf where this character will be put.
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   190
             // Record a new entry in pbuf if pbuf is empty or if sp and its
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   191
             // corresponding source position are not equidistant from the
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   192
             // corresponding values in the latest entry in the pbuf array.
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   193
             // (i.e. there is a discontinuity in the map function.)
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   194
             if ((pp == 0)
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   195
                     || (sp - pbuf[pp - 2] != (startPos + bp) - pbuf[pp - 1])) {
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   196
                 if (pp + 1 >= pbuf.length) {
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   197
                     int[] new_pbuf = new int[pbuf.length * 2];
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   198
                     System.arraycopy(pbuf, 0, new_pbuf, 0, pbuf.length);
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   199
                     pbuf = new_pbuf;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   200
                 }
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   201
                 pbuf[pp] = sp;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   202
                 pbuf[pp + 1] = startPos + bp;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   203
                 pp += 2;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   204
             }
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   205
             super.putChar(ch, scan);
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   206
         }
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   207
     }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   208
16810
670d880283e2 8011676: Instances of Tokens.Comment should not be defined in inner classes
jjg
parents: 15552
diff changeset
   209
     protected static class JavadocComment extends JavaTokenizer.BasicComment<DocReader> {
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   210
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   211
        /**
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   212
        * Translated and stripped contents of doc comment
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   213
        */
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   214
        private String docComment = null;
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   215
        private int[] docPosns = null;
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   216
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   217
        JavadocComment(DocReader reader, CommentStyle cs) {
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   218
            super(reader, cs);
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   219
        }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   220
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   221
        @Override
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   222
        public String getText() {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   223
            if (!scanned && cs == CommentStyle.JAVADOC) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   224
                scanDocComment();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   225
            }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   226
            return docComment;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   227
        }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   228
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   229
        @Override
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   230
        public int getSourcePos(int pos) {
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   231
            // Binary search to find the entry for which the string index is
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   232
            // less than pos. Since docPosns is a list of pairs of integers
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   233
            // we must make sure the index is always even.
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   234
            // If we find an exact match for pos, the other item in the pair
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   235
            // gives the source pos; otherwise, compute the source position
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   236
            // relative to the best match found in the array.
14541
36f9d11fc9aa 7021614: extend com.sun.source API to support parsing javadoc comments
jjg
parents: 13079
diff changeset
   237
            if (pos == Position.NOPOS)
36f9d11fc9aa 7021614: extend com.sun.source API to support parsing javadoc comments
jjg
parents: 13079
diff changeset
   238
                return Position.NOPOS;
15552
99e4c7eb352c 8007096: DocLint parsing problems with some comments
jjg
parents: 14541
diff changeset
   239
            if (pos < 0 || pos > docComment.length())
14541
36f9d11fc9aa 7021614: extend com.sun.source API to support parsing javadoc comments
jjg
parents: 13079
diff changeset
   240
                throw new StringIndexOutOfBoundsException(String.valueOf(pos));
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   241
            if (docPosns == null)
14541
36f9d11fc9aa 7021614: extend com.sun.source API to support parsing javadoc comments
jjg
parents: 13079
diff changeset
   242
                return Position.NOPOS;
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   243
            int start = 0;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   244
            int end = docPosns.length;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   245
            while (start < end - 2) {
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   246
                // find an even index midway between start and end
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   247
                int index = ((start  + end) / 4) * 2;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   248
                if (docPosns[index] < pos)
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   249
                    start = index;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   250
                else if (docPosns[index] == pos)
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   251
                    return docPosns[index + 1];
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   252
                else
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   253
                    end = index;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   254
            }
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   255
            return docPosns[start + 1] + (pos - docPosns[start]);
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   256
        }
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   257
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   258
        @Override
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   259
        @SuppressWarnings("fallthrough")
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   260
        protected void scanDocComment() {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   261
             try {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   262
                 boolean firstLine = true;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   263
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   264
                 // Skip over first slash
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   265
                 comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   266
                 // Skip over first star
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   267
                 comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   268
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   269
                 // consume any number of stars
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   270
                 while (comment_reader.bp < comment_reader.buflen && comment_reader.ch == '*') {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   271
                     comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   272
                 }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   273
                 // is the comment in the form /**/, /***/, /****/, etc. ?
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   274
                 if (comment_reader.bp < comment_reader.buflen && comment_reader.ch == '/') {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   275
                     docComment = "";
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   276
                     return;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   277
                 }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   278
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   279
                 // skip a newline on the first line of the comment.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   280
                 if (comment_reader.bp < comment_reader.buflen) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   281
                     if (comment_reader.ch == LF) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   282
                         comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   283
                         firstLine = false;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   284
                     } else if (comment_reader.ch == CR) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   285
                         comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   286
                         if (comment_reader.ch == LF) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   287
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   288
                             firstLine = false;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   289
                         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   290
                     }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   291
                 }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   292
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   293
             outerLoop:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   294
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   295
                 // The outerLoop processes the doc comment, looping once
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   296
                 // for each line.  For each line, it first strips off
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   297
                 // whitespace, then it consumes any stars, then it
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   298
                 // puts the rest of the line into our buffer.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   299
                 while (comment_reader.bp < comment_reader.buflen) {
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   300
                     int begin_bp = comment_reader.bp;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   301
                     char begin_ch = comment_reader.ch;
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   302
                     // The wsLoop consumes whitespace from the beginning
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   303
                     // of each line.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   304
                 wsLoop:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   305
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   306
                     while (comment_reader.bp < comment_reader.buflen) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   307
                         switch(comment_reader.ch) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   308
                         case ' ':
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   309
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   310
                             break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   311
                         case '\t':
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   312
                             comment_reader.col = ((comment_reader.col - 1) / TabInc * TabInc) + TabInc;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   313
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   314
                             break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   315
                         case FF:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   316
                             comment_reader.col = 0;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   317
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   318
                             break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   319
         // Treat newline at beginning of line (blank line, no star)
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   320
         // as comment text.  Old Javadoc compatibility requires this.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   321
         /*---------------------------------*
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   322
                         case CR: // (Spec 3.4)
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   323
                             doc_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   324
                             if (ch == LF) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   325
                                 col = 0;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   326
                                 doc_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   327
                             }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   328
                             break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   329
                         case LF: // (Spec 3.4)
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   330
                             doc_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   331
                             break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   332
         *---------------------------------*/
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   333
                         default:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   334
                             // we've seen something that isn't whitespace;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   335
                             // jump out.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   336
                             break wsLoop;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   337
                         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   338
                     }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   339
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   340
                     // Are there stars here?  If so, consume them all
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   341
                     // and check for the end of comment.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   342
                     if (comment_reader.ch == '*') {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   343
                         // skip all of the stars
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   344
                         do {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   345
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   346
                         } while (comment_reader.ch == '*');
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   347
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   348
                         // check for the closing slash.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   349
                         if (comment_reader.ch == '/') {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   350
                             // We're done with the doc comment
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   351
                             // scanChar() and breakout.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   352
                             break outerLoop;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   353
                         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   354
                     } else if (! firstLine) {
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   355
                         // The current line does not begin with a '*' so we will
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   356
                         // treat it as comment
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   357
                         comment_reader.bp = begin_bp;
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   358
                         comment_reader.ch = begin_ch;
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   359
                     }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   360
                     // The textLoop processes the rest of the characters
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   361
                     // on the line, adding them to our buffer.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   362
                 textLoop:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   363
                     while (comment_reader.bp < comment_reader.buflen) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   364
                         switch (comment_reader.ch) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   365
                         case '*':
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   366
                             // Is this just a star?  Or is this the
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   367
                             // end of a comment?
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   368
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   369
                             if (comment_reader.ch == '/') {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   370
                                 // This is the end of the comment,
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   371
                                 // set ch and return our buffer.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   372
                                 break outerLoop;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   373
                             }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   374
                             // This is just an ordinary star.  Add it to
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   375
                             // the buffer.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   376
                             comment_reader.putChar('*', false);
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   377
                             break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   378
                         case ' ':
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   379
                         case '\t':
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   380
                             comment_reader.putChar(comment_reader.ch, false);
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   381
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   382
                             break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   383
                         case FF:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   384
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   385
                             break textLoop; // treat as end of line
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   386
                         case CR: // (Spec 3.4)
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   387
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   388
                             if (comment_reader.ch != LF) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   389
                                 // Canonicalize CR-only line terminator to LF
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   390
                                 comment_reader.putChar((char)LF, false);
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   391
                                 break textLoop;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   392
                             }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   393
                             /* fall through to LF case */
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   394
                         case LF: // (Spec 3.4)
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   395
                             // We've seen a newline.  Add it to our
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   396
                             // buffer and break out of this loop,
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   397
                             // starting fresh on a new line.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   398
                             comment_reader.putChar(comment_reader.ch, false);
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   399
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   400
                             break textLoop;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   401
                         default:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   402
                             // Add the character to our buffer.
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   403
                             comment_reader.putChar(comment_reader.ch, false);
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   404
                             comment_reader.scanCommentChar();
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   405
                         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   406
                     } // end textLoop
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   407
                     firstLine = false;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   408
                 } // end outerLoop
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   409
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   410
                 if (comment_reader.sp > 0) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   411
                     int i = comment_reader.sp - 1;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   412
                 trailLoop:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   413
                     while (i > -1) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   414
                         switch (comment_reader.sbuf[i]) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   415
                         case '*':
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   416
                             i--;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   417
                             break;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   418
                         default:
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   419
                             break trailLoop;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   420
                         }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   421
                     }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   422
                     comment_reader.sp = i + 1;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   423
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   424
                     // Store the text of the doc comment
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   425
                    docComment = comment_reader.chars();
13078
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   426
                    docPosns = new int[comment_reader.pp];
11d5e1c88864 7178297: provide mapping from doc comment position to source file position
jjg
parents: 10948
diff changeset
   427
                    System.arraycopy(comment_reader.pbuf, 0, docPosns, 0, docPosns.length);
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   428
                } else {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   429
                    docComment = "";
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   430
                }
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   431
            } finally {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   432
                scanned = true;
13079
79537cf1409e 7178763: javadoc OutOfMemory error results in several jdk8 tl nightly failures
jjg
parents: 13078
diff changeset
   433
                comment_reader = null;
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   434
                if (docComment != null &&
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   435
                        docComment.matches("(?sm).*^\\s*@deprecated( |$).*")) {
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   436
                    deprecatedFlag = true;
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   437
                }
10815
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
   438
            }
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
   439
        }
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
   440
    }
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
   441
10948
063463f6535f 7104201: Refactor DocCommentScanner
mcimadamore
parents: 10815
diff changeset
   442
    @Override
10815
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
   443
    public Position.LineMap getLineMap() {
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
   444
        char[] buf = reader.getRawCharacters();
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
   445
        return Position.makeLineMap(buf, buf.length, true);
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
   446
    }
a719aa5f1631 7096014: Javac tokens should retain state
mcimadamore
parents:
diff changeset
   447
}