Coverage Report - com.puppycrawl.tools.checkstyle.checks.javadoc.utils.BlockTagUtils
 
Classes in this File Line Coverage Branch Coverage Complexity
BlockTagUtils
100%
24/24
100%
10/10
3
 
 1  
 ////////////////////////////////////////////////////////////////////////////////
 2  
 // checkstyle: Checks Java source code for adherence to a set of rules.
 3  
 // Copyright (C) 2001-2017 the original author or authors.
 4  
 //
 5  
 // This library is free software; you can redistribute it and/or
 6  
 // modify it under the terms of the GNU Lesser General Public
 7  
 // License as published by the Free Software Foundation; either
 8  
 // version 2.1 of the License, or (at your option) any later version.
 9  
 //
 10  
 // This library is distributed in the hope that it will be useful,
 11  
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 12  
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 13  
 // Lesser General Public License for more details.
 14  
 //
 15  
 // You should have received a copy of the GNU Lesser General Public
 16  
 // License along with this library; if not, write to the Free Software
 17  
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 18  
 ////////////////////////////////////////////////////////////////////////////////
 19  
 
 20  
 package com.puppycrawl.tools.checkstyle.checks.javadoc.utils;
 21  
 
 22  
 import java.util.ArrayList;
 23  
 import java.util.List;
 24  
 import java.util.regex.Matcher;
 25  
 import java.util.regex.Pattern;
 26  
 
 27  
 import com.puppycrawl.tools.checkstyle.api.LineColumn;
 28  
 
 29  
 /**
 30  
  * Tools for parsing block tags from a Javadoc comment.
 31  
  *
 32  
  * @author Nathan Naze
 33  
  */
 34  
 public final class BlockTagUtils {
 35  
 
 36  
     /** Block tag pattern for a first line. */
 37  1
     private static final Pattern BLOCK_TAG_PATTERN_FIRST_LINE = Pattern.compile(
 38  
         "/\\*{2,}\\s*@(\\p{Alpha}+)\\s");
 39  
 
 40  
     /** Block tag pattern. */
 41  1
     private static final Pattern BLOCK_TAG_PATTERN = Pattern.compile(
 42  
         "^\\s*\\**\\s*@(\\p{Alpha}+)\\s");
 43  
 
 44  
     /** Closing tag. */
 45  
     private static final String JAVADOC_CLOSING_TAG = "*/";
 46  
 
 47  
     /** Prevent instantiation. */
 48  1
     private BlockTagUtils() {
 49  1
     }
 50  
 
 51  
     /**
 52  
      * Extract the block tags from a Javadoc comment.
 53  
      * @param lines The text of the comment, as separate lines.
 54  
      * @return The tags extracted from the block.
 55  
      */
 56  
     public static List<TagInfo> extractBlockTags(String... lines) {
 57  103
         final List<TagInfo> tags = new ArrayList<>();
 58  
 
 59  533
         for (int i = 0; i < lines.length; i++) {
 60  
             // Starting lines of a comment have a different first line pattern.
 61  430
             final boolean isFirstLine = i == 0;
 62  
             final Pattern pattern;
 63  430
             if (isFirstLine) {
 64  103
                 pattern = BLOCK_TAG_PATTERN_FIRST_LINE;
 65  
             }
 66  
             else {
 67  327
                 pattern = BLOCK_TAG_PATTERN;
 68  
             }
 69  
 
 70  430
             final String line = lines[i];
 71  430
             final Matcher tagMatcher = pattern.matcher(line);
 72  
 
 73  430
             if (tagMatcher.find()) {
 74  127
                 final String tagName = tagMatcher.group(1);
 75  
 
 76  
                 // offset of one for the @ character
 77  127
                 final int colNum = tagMatcher.start(1) - 1;
 78  127
                 final int lineNum = i + 1;
 79  
 
 80  127
                 final String remainder = line.substring(tagMatcher.end(1));
 81  127
                 String tagValue = remainder.trim();
 82  
 
 83  
                 // Handle the case where we're on the last line of a Javadoc comment.
 84  127
                 if (tagValue.endsWith(JAVADOC_CLOSING_TAG)) {
 85  15
                     final int endIndex = tagValue.length() - JAVADOC_CLOSING_TAG.length();
 86  15
                     tagValue = tagValue.substring(0, endIndex).trim();
 87  
                 }
 88  
 
 89  127
                 final LineColumn position = new LineColumn(lineNum, colNum);
 90  127
                 tags.add(new TagInfo(tagName, tagValue, position));
 91  
             }
 92  
         }
 93  
 
 94  103
         return tags;
 95  
     }
 96  
 }