1.1 --- a/src/share/classes/com/sun/tools/javac/parser/DocCommentParser.java Sun Jan 27 19:38:44 2013 +0000 1.2 +++ b/src/share/classes/com/sun/tools/javac/parser/DocCommentParser.java Wed Jan 30 09:40:54 2013 -0800 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -279,13 +279,7 @@ 1.11 try { 1.12 nextChar(); 1.13 if (isIdentifierStart(ch)) { 1.14 - int namePos = bp; 1.15 - nextChar(); 1.16 - while (isIdentifierPart(ch)) 1.17 - nextChar(); 1.18 - int nameLen = bp - namePos; 1.19 - 1.20 - Name name = names.fromChars(buf, namePos, nameLen); 1.21 + Name name = readIdentifier(); 1.22 TagParser tp = tagParsers.get(name); 1.23 if (tp == null) { 1.24 List<DCTree> content = blockContent(); 1.25 @@ -334,14 +328,9 @@ 1.26 try { 1.27 nextChar(); 1.28 if (isIdentifierStart(ch)) { 1.29 - int namePos = bp; 1.30 - nextChar(); 1.31 - while (isIdentifierPart(ch)) 1.32 - nextChar(); 1.33 - int nameLen = bp - namePos; 1.34 + Name name = readIdentifier(); 1.35 skipWhitespace(); 1.36 1.37 - Name name = names.fromChars(buf, namePos, nameLen); 1.38 TagParser tp = tagParsers.get(name); 1.39 if (tp == null) { 1.40 DCTree text = inlineText(); 1.41 @@ -575,10 +564,8 @@ 1.42 int pos = bp; 1.43 1.44 if (isJavaIdentifierStart(ch)) { 1.45 - nextChar(); 1.46 - while (isJavaIdentifierPart(ch)) 1.47 - nextChar(); 1.48 - return m.at(pos).Identifier(names.fromChars(buf, pos, bp - pos)); 1.49 + Name name = readJavaIdentifier(); 1.50 + return m.at(pos).Identifier(name); 1.51 } 1.52 1.53 throw new ParseException("dc.identifier.expected"); 1.54 @@ -703,39 +690,36 @@ 1.55 protected DCTree entity() { 1.56 int p = bp; 1.57 nextChar(); 1.58 - int namep = bp; 1.59 + Name name = null; 1.60 boolean checkSemi = false; 1.61 if (ch == '#') { 1.62 + int namep = bp; 1.63 nextChar(); 1.64 if (isDecimalDigit(ch)) { 1.65 nextChar(); 1.66 while (isDecimalDigit(ch)) 1.67 nextChar(); 1.68 - checkSemi = true; 1.69 + name = names.fromChars(buf, namep, bp - namep); 1.70 } else if (ch == 'x' || ch == 'X') { 1.71 nextChar(); 1.72 if (isHexDigit(ch)) { 1.73 nextChar(); 1.74 while (isHexDigit(ch)) 1.75 nextChar(); 1.76 - checkSemi = true; 1.77 + name = names.fromChars(buf, namep, bp - namep); 1.78 } 1.79 } 1.80 } else if (isIdentifierStart(ch)) { 1.81 - nextChar(); 1.82 - while (isIdentifierPart(ch)) 1.83 - nextChar(); 1.84 - checkSemi = true; 1.85 + name = readIdentifier(); 1.86 } 1.87 1.88 - if (checkSemi && ch == ';') { 1.89 + if (name == null) 1.90 + return erroneous("dc.bad.entity", p); 1.91 + else { 1.92 + if (ch != ';') 1.93 + return erroneous("dc.missing.semicolon", p); 1.94 nextChar(); 1.95 - return m.at(p).Entity(names.fromChars(buf, namep, bp - namep - 1)); 1.96 - } else { 1.97 - String code = checkSemi 1.98 - ? "dc.missing.semicolon" 1.99 - : "dc.bad.entity"; 1.100 - return erroneous(code, p); 1.101 + return m.at(p).Entity(name); 1.102 } 1.103 } 1.104 1.105 @@ -747,11 +731,7 @@ 1.106 int p = bp; 1.107 nextChar(); 1.108 if (isIdentifierStart(ch)) { 1.109 - int namePos = bp; 1.110 - nextChar(); 1.111 - while (isIdentifierPart(ch)) 1.112 - nextChar(); 1.113 - int nameLen = bp - namePos; 1.114 + Name name = readIdentifier(); 1.115 List<DCTree> attrs = htmlAttrs(); 1.116 if (attrs != null) { 1.117 boolean selfClosing = false; 1.118 @@ -761,22 +741,16 @@ 1.119 } 1.120 if (ch == '>') { 1.121 nextChar(); 1.122 - Name name = names.fromChars(buf, namePos, nameLen); 1.123 return m.at(p).StartElement(name, attrs, selfClosing); 1.124 } 1.125 } 1.126 } else if (ch == '/') { 1.127 nextChar(); 1.128 if (isIdentifierStart(ch)) { 1.129 - int namePos = bp; 1.130 - nextChar(); 1.131 - while (isIdentifierPart(ch)) 1.132 - nextChar(); 1.133 - int nameLen = bp - namePos; 1.134 + Name name = readIdentifier(); 1.135 skipWhitespace(); 1.136 if (ch == '>') { 1.137 nextChar(); 1.138 - Name name = names.fromChars(buf, namePos, nameLen); 1.139 return m.at(p).EndElement(name); 1.140 } 1.141 } 1.142 @@ -822,10 +796,7 @@ 1.143 loop: 1.144 while (isIdentifierStart(ch)) { 1.145 int namePos = bp; 1.146 - nextChar(); 1.147 - while (isIdentifierPart(ch)) 1.148 - nextChar(); 1.149 - int nameLen = bp - namePos; 1.150 + Name name = readIdentifier(); 1.151 skipWhitespace(); 1.152 List<DCTree> value = null; 1.153 ValueKind vkind = ValueKind.EMPTY; 1.154 @@ -862,7 +833,6 @@ 1.155 skipWhitespace(); 1.156 value = v.toList(); 1.157 } 1.158 - Name name = names.fromChars(buf, namePos, nameLen); 1.159 DCAttribute attr = m.at(namePos).Attribute(name, vkind, value); 1.160 attrs.add(attr); 1.161 } 1.162 @@ -897,7 +867,7 @@ 1.163 protected DCErroneous erroneous(String code, int pos) { 1.164 int i = bp - 1; 1.165 loop: 1.166 - while (i > 0) { 1.167 + while (i > pos) { 1.168 switch (buf[i]) { 1.169 case '\f': case '\n': case '\r': 1.170 newline = true; 1.171 @@ -926,16 +896,24 @@ 1.172 return Character.isUnicodeIdentifierStart(ch); 1.173 } 1.174 1.175 - protected boolean isIdentifierPart(char ch) { 1.176 - return Character.isUnicodeIdentifierPart(ch); 1.177 + protected Name readIdentifier() { 1.178 + int start = bp; 1.179 + nextChar(); 1.180 + while (bp < buflen && Character.isUnicodeIdentifierPart(ch)) 1.181 + nextChar(); 1.182 + return names.fromChars(buf, start, bp - start); 1.183 } 1.184 1.185 protected boolean isJavaIdentifierStart(char ch) { 1.186 return Character.isJavaIdentifierStart(ch); 1.187 } 1.188 1.189 - protected boolean isJavaIdentifierPart(char ch) { 1.190 - return Character.isJavaIdentifierPart(ch); 1.191 + protected Name readJavaIdentifier() { 1.192 + int start = bp; 1.193 + nextChar(); 1.194 + while (bp < buflen && Character.isJavaIdentifierPart(ch)) 1.195 + nextChar(); 1.196 + return names.fromChars(buf, start, bp - start); 1.197 } 1.198 1.199 protected boolean isDecimalDigit(char ch) {