Issue #2631: Optimize JavadocUtils

This commit is contained in:
Vladislav Lisetskiy 2015-12-20 23:45:05 +03:00 committed by Roman Ivanov
parent dedcabd90d
commit ed6c2ea133
1 changed files with 35 additions and 7 deletions

View File

@ -52,6 +52,22 @@ public final class JavadocUtils {
private static final String UNKNOWN_JAVADOC_TOKEN_ID_EXCEPTION_MESSAGE = "Unknown javadoc"
+ " token id. Given id: ";
/** Comment pattern. */
private static final Pattern COMMENT_PATTERN = Pattern.compile(
"^\\s*(?:/\\*{2,}|\\*+)\\s*(.*)");
/** Block tag pattern for a first line. */
private static final Pattern BLOCK_TAG_PATTERN_FIRST_LINE = Pattern.compile(
"/\\*{2,}\\s*@(\\p{Alpha}+)\\s");
/** Block tag pattern. */
private static final Pattern BLOCK_TAG_PATTERN = Pattern.compile(
"^\\s*\\**\\s*@(\\p{Alpha}+)\\s");
/** Inline tag pattern. */
private static final Pattern INLINE_TAG_PATTERN = Pattern.compile(
".*?\\{@(\\p{Alpha}+)\\s+(.*?)\\}");
// Using reflection gets all token names and values from JavadocTokenTypes class
// and saves to TOKEN_NAME_TO_VALUE and TOKEN_VALUE_TO_NAME collections.
static {
@ -107,10 +123,9 @@ public final class JavadocUtils {
final String[] text = textBlock.getText();
final List<JavadocTag> tags = Lists.newArrayList();
final List<InvalidJavadocTag> invalidTags = Lists.newArrayList();
Pattern blockTagPattern = Pattern.compile("/\\*{2,}\\s*@(\\p{Alpha}+)\\s");
for (int i = 0; i < text.length; i++) {
final String textValue = text[i];
final Matcher blockTagMatcher = blockTagPattern.matcher(textValue);
final Matcher blockTagMatcher = getBlockTagPattern(i).matcher(textValue);
if ((tagType == JavadocTagType.ALL || tagType == JavadocTagType.BLOCK)
&& blockTagMatcher.find()) {
final String tagName = blockTagMatcher.group(1);
@ -135,11 +150,26 @@ public final class JavadocUtils {
else if (tagType == JavadocTagType.ALL || tagType == JavadocTagType.INLINE) {
lookForInlineTags(textBlock, i, tags, invalidTags);
}
blockTagPattern = Pattern.compile("^\\s*\\**\\s*@(\\p{Alpha}+)\\s");
}
return new JavadocTags(tags, invalidTags);
}
/**
* Get a block tag pattern depending on a line number of a javadoc.
* @param lineNumber the line number.
* @return a block tag pattern.
*/
private static Pattern getBlockTagPattern(int lineNumber) {
final Pattern blockTagPattern;
if (lineNumber == 0) {
blockTagPattern = BLOCK_TAG_PATTERN_FIRST_LINE;
}
else {
blockTagPattern = BLOCK_TAG_PATTERN;
}
return blockTagPattern;
}
/**
* Looks for inline tags in comment and adds them to the proper tags collection.
* @param comment comment text block
@ -151,8 +181,7 @@ public final class JavadocUtils {
final List<JavadocTag> validTags, final List<InvalidJavadocTag> invalidTags) {
final String text = comment.getText()[lineNumber];
// Match Javadoc text after comment characters
final Pattern commentPattern = Pattern.compile("^\\s*(?:/\\*{2,}|\\*+)\\s*(.*)");
final Matcher commentMatcher = commentPattern.matcher(text);
final Matcher commentMatcher = COMMENT_PATTERN.matcher(text);
final String commentContents;
// offset including comment characters
@ -167,8 +196,7 @@ public final class JavadocUtils {
commentContents = text;
commentOffset = 0;
}
final Pattern tagPattern = Pattern.compile(".*?\\{@(\\p{Alpha}+)\\s+(.*?)\\}");
final Matcher tagMatcher = tagPattern.matcher(commentContents);
final Matcher tagMatcher = INLINE_TAG_PATTERN.matcher(commentContents);
while (tagMatcher.find()) {
final String tagName = tagMatcher.group(1);
final String tagValue = tagMatcher.group(2).trim();