diff --git a/paper-checkstyle/src/main/java/io/papermc/checkstyle/checks/JavadocAlignParameterDescriptionCheck.java b/paper-checkstyle/src/main/java/io/papermc/checkstyle/checks/JavadocAlignParameterDescriptionCheck.java index ef47c063dad3..badf3f240036 100644 --- a/paper-checkstyle/src/main/java/io/papermc/checkstyle/checks/JavadocAlignParameterDescriptionCheck.java +++ b/paper-checkstyle/src/main/java/io/papermc/checkstyle/checks/JavadocAlignParameterDescriptionCheck.java @@ -6,7 +6,9 @@ import com.puppycrawl.tools.checkstyle.utils.JavadocUtil; import io.papermc.checkstyle.Util; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -30,6 +32,7 @@ record ParamDesc(DetailNode node, int startCol) { final List params = new ArrayList<>(); int maxColumn = -1; DetailNode child = detailNode.getFirstChild(); + final Set visitedLines = new HashSet<>(); for (final DetailNode javadocBlock : JavadocUtil.getAllNodesOfType(detailNode, JavadocCommentsTokenTypes.JAVADOC_BLOCK_TAG)) { final DetailNode paramBlock = JavadocUtil.findFirstToken(javadocBlock, JavadocCommentsTokenTypes.PARAM_BLOCK_TAG); if (paramBlock == null) { @@ -41,6 +44,9 @@ record ParamDesc(DetailNode node, int startCol) { } // iterate over all text nodes (multiline) for (final DetailNode textNode : JavadocUtil.getAllNodesOfType(paramDescription, JavadocCommentsTokenTypes.TEXT)) { + if (!visitedLines.add(textNode.getLineNumber())) { + continue; + } final Matcher matcher = SPACE_PREFIX.matcher(textNode.getText()); int paramDescColNum = textNode.getColumnNumber(); if (matcher.find()) { diff --git a/paper-checkstyle/src/testData/java/testdata/JavadocParamAlignment.java b/paper-checkstyle/src/testData/java/testdata/JavadocParamAlignment.java index 7f2531c4d52d..a1d0b19afdcb 100644 --- a/paper-checkstyle/src/testData/java/testdata/JavadocParamAlignment.java +++ b/paper-checkstyle/src/testData/java/testdata/JavadocParamAlignment.java @@ -45,4 +45,26 @@ public void method_multiline(String a, String superLongParamName) { public void method_multiline_correct(String a, String superLongParamName) { } + /** + * A method that does something + * + * @param a this is a description + * with a {@link #method(String, String)} link tag + * @param superLongParamName a description + * blabla + */ + public void method_multiline_correct_with_link(String a, String superLongParamName) { + } + + /** + * A method where line 2 starts with a link tag + * + * @param a this is a description + * {@link #method(String, String)} is at line start + * @param superLongParamName a description + * blabla + */ + public void method_line2_starts_with_link(String a, String superLongParamName) { + } + }