You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kw...@apache.org on 2026/08/17 09:48:07 UTC

(maven-plugin-tools) branch master updated: Normalize references in Javadoc

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-plugin-tools.git


The following commit(s) were added to refs/heads/master by this push:
     new 438a3acc Normalize references in Javadoc
438a3acc is described below

commit 438a3acc96b918382f3f98e0dca56f8d683c63b5
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Sun Aug 16 13:02:22 2026 +0200

    Normalize references in Javadoc
    
    Method references may contain argument names (next to types) and spaces.
    Both must be removed prior generating the link to Javadoc.
---
 .../tools/plugin/javadoc/JavadocReference.java     | 34 +++++++++++++++++++++-
 .../tools/plugin/javadoc/JavadocReferenceTest.java | 19 ++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)

diff --git a/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocReference.java b/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocReference.java
index 4093fa18..5577e724 100644
--- a/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocReference.java
+++ b/maven-plugin-tools-api/src/main/java/org/apache/maven/tools/plugin/javadoc/JavadocReference.java
@@ -18,8 +18,11 @@
  */
 package org.apache.maven.tools.plugin.javadoc;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.StringTokenizer;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -63,13 +66,15 @@ public class JavadocReference {
      * @throws IllegalArgumentException in case the reference has an invalid format
      */
     public static JavadocReference parse(String reference) {
+        // must match the behaviour of com.sun.tools.javac.parser.ReferenceParser#parseReference
         Matcher matcher = REFERENCE_VALUE_PATTERN.matcher(reference);
         if (!matcher.matches()) {
             throw new IllegalArgumentException("Invalid format of javadoc reference: " + reference);
         }
         final Optional<String> moduleName = getOptionalGroup(matcher, GROUP_INDEX_MODULE);
         final Optional<String> packageNameClassName = getOptionalGroup(matcher, GROUP_INDEX_PACKAGECLASS);
-        final Optional<String> member = getOptionalGroup(matcher, GROUP_INDEX_MEMBER);
+        final Optional<String> member =
+                getOptionalGroup(matcher, GROUP_INDEX_MEMBER).map(JavadocReference::normalizeMember);
         final Optional<String> label = getOptionalGroup(matcher, GROUP_INDEX_LABEL);
         return new JavadocReference(moduleName, packageNameClassName, member, label);
     }
@@ -142,4 +147,31 @@ public class JavadocReference {
                 && Objects.equals(packageNameClassName, other.packageNameClassName)
                 && Objects.equals(moduleName, other.moduleName);
     }
+
+    static String normalizeMember(String member) {
+        // for methods:
+        int indexOfParenthesis = member.indexOf('(');
+        if (indexOfParenthesis != -1) {
+            if (!member.endsWith(")")) {
+                throw new IllegalArgumentException("Invalid format of javadoc reference member: " + member);
+            }
+            // for each parameter separated by a comma, remove the parameter name and keep only the type
+            StringTokenizer tokenizer =
+                    new StringTokenizer(member.substring(indexOfParenthesis + 1, member.length() - 1), ",");
+            Collection<String> parameterTypes = new ArrayList<>();
+            while (tokenizer.hasMoreTokens()) {
+                String parameter = tokenizer.nextToken().trim();
+                // remove parameter name if present
+                if (parameter.contains(" ")) {
+                    parameterTypes.add(parameter.substring(0, parameter.indexOf(' ')));
+                } else {
+                    parameterTypes.add(parameter);
+                }
+            }
+            member = member.substring(0, indexOfParenthesis) + "(" + String.join(",", parameterTypes) + ")";
+        }
+        // remove whitespace
+        member = member.replaceAll("\\s+", "");
+        return member;
+    }
 }
diff --git a/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocReferenceTest.java b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocReferenceTest.java
index be3cea5c..8b4c1191 100644
--- a/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocReferenceTest.java
+++ b/maven-plugin-tools-api/src/test/java/org/apache/maven/tools/plugin/javadoc/JavadocReferenceTest.java
@@ -60,4 +60,23 @@ class JavadocReferenceTest {
                         Optional.empty(), Optional.empty(), Optional.of("member"), Optional.of("label with spaces")),
                 JavadocReference.parse("#member label with spaces"));
     }
+
+    @Test
+    void parseNonNormalizedMethodReferences() throws Exception {
+        assertEquals(
+                new JavadocReference(
+                        Optional.empty(),
+                        Optional.of("package.Class"),
+                        Optional.of("member(ArgType1,ArgType2)"),
+                        Optional.of("label")),
+                // whitespace between argument and argument names (both should be removed)
+                JavadocReference.parse("package.Class#member(ArgType1 arg1, ArgType2 arg2) label"));
+        assertEquals(
+                new JavadocReference(
+                        Optional.empty(),
+                        Optional.of("package.Class"),
+                        Optional.of("member(ArgType1,ArgType2,ArgType3)"),
+                        Optional.of("label")),
+                JavadocReference.parse("package.Class#member(ArgType1 arg1, ArgType2,ArgType3 arg3) label"));
+    }
 }