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

sunlan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new 3fa8defe57 GROOVY-11755: Support groovydoc for records (#2290)
3fa8defe57 is described below

commit 3fa8defe5733ad97e0d47489a78bdebcdb877492
Author: Liviu Carausu <[email protected]>
AuthorDate: Sun Sep 14 03:20:58 2025 +0200

    GROOVY-11755: Support groovydoc for records (#2290)
    
    * support groovydoc for records
    
    * added tests for record
    
    * add license header
    
    ---------
    
    Co-authored-by: ZNT\lcarausu <[email protected]>
---
 .../groovydoc/antlr4/GroovydocJavaVisitor.java     | 50 +++++++++++++++++++---
 .../groovy/tools/groovydoc/GroovyDocTest.java      | 19 +++++++-
 .../tools/groovydoc/testfiles/records/Record.java  | 33 ++++++++++++++
 .../test/resources/groovydoc/groovyDocTests.xml    | 13 ++++++
 4 files changed, 108 insertions(+), 7 deletions(-)

diff --git 
a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/antlr4/GroovydocJavaVisitor.java
 
b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/antlr4/GroovydocJavaVisitor.java
index 2592cd3cee..440d81c5e3 100644
--- 
a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/antlr4/GroovydocJavaVisitor.java
+++ 
b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/antlr4/GroovydocJavaVisitor.java
@@ -25,12 +25,14 @@ import com.github.javaparser.ast.body.AnnotationDeclaration;
 import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
 import com.github.javaparser.ast.body.CallableDeclaration;
 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.CompactConstructorDeclaration;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
 import com.github.javaparser.ast.body.EnumConstantDeclaration;
 import com.github.javaparser.ast.body.EnumDeclaration;
 import com.github.javaparser.ast.body.FieldDeclaration;
 import com.github.javaparser.ast.body.MethodDeclaration;
 import com.github.javaparser.ast.body.Parameter;
+import com.github.javaparser.ast.body.RecordDeclaration;
 import com.github.javaparser.ast.body.TypeDeclaration;
 import com.github.javaparser.ast.expr.AnnotationExpr;
 import com.github.javaparser.ast.expr.Name;
@@ -62,13 +64,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
-public class GroovydocJavaVisitor extends VoidVisitorAdapter<Object> {
+public class GroovydocJavaVisitor
+    extends VoidVisitorAdapter<Object> {
     private final List<LinkArgument> links;
     private SimpleGroovyClassDoc currentClassDoc = null;
-    private Map<String, GroovyClassDoc> classDocs = new LinkedHashMap<>();
-    private String packagePath;
+    private final Map<String, GroovyClassDoc> classDocs = new 
LinkedHashMap<>();
+    private final String packagePath;
     private final Map<String, String> aliases = new LinkedHashMap<>();
-    private List<String> imports = new ArrayList<>();
+    private final List<String> imports = new ArrayList<>();
     private static final String FS = "/";
 
     public GroovydocJavaVisitor(String packagePath, List<LinkArgument> links) {
@@ -148,7 +151,7 @@ public class GroovydocJavaVisitor extends 
VoidVisitorAdapter<Object> {
         n.getJavadocComment().ifPresent(javadocComment ->
                 fieldDoc.setRawCommentText(javadocComment.getContent()));
         n.getDefaultValue().ifPresent(defValue -> {
-            fieldDoc.setRawCommentText(fieldDoc.getRawCommentText() + "\n* 
@default " + defValue.toString());
+            fieldDoc.setRawCommentText(fieldDoc.getRawCommentText() + "\n* 
@default " + defValue);
             fieldDoc.setConstantValueExpression(defValue.toString());
         });
         super.visit(n, arg);
@@ -181,6 +184,26 @@ public class GroovydocJavaVisitor extends 
VoidVisitorAdapter<Object> {
         }
     }
 
+    @Override
+    public void visit(final RecordDeclaration n, final Object arg) {
+        SimpleGroovyClassDoc parent = visit(n);
+        if (n.isRecordDeclaration()) {
+            currentClassDoc.setTokenType(SimpleGroovyDoc.RECORD_DEF);
+        }
+        super.visit(n,arg);
+        if (parent != null) {
+            currentClassDoc = parent;
+        }
+    }
+
+    @Override
+    public void visit(final CompactConstructorDeclaration c, Object arg) {
+        SimpleGroovyConstructorDoc meth = new 
SimpleGroovyConstructorDoc(c.getNameAsString(), currentClassDoc);
+        setCompactConstructor(c, meth);
+        currentClassDoc.add(meth);
+        super.visit(c, arg);
+    }
+
     private String fullName(ClassOrInterfaceType et) {
         StringBuilder name = new StringBuilder();
         et.getScope().ifPresent(sc -> name.append(sc.toString()));
@@ -303,6 +326,23 @@ public class GroovydocJavaVisitor extends 
VoidVisitorAdapter<Object> {
         }
     }
 
+    private void setCompactConstructor(CompactConstructorDeclaration n, 
SimpleGroovyExecutableMemberDoc methOrCons) {
+        n.getComment().ifPresent(javadocComment ->
+                                            
methOrCons.setRawCommentText(javadocComment.getContent()));
+        NodeList<Modifier> mods = n.getModifiers();
+        if (currentClassDoc.isInterface()) {
+            mods.add(Modifier.publicModifier());
+        }
+        setModifiers(mods, methOrCons);
+        processAnnotations(methOrCons, n);
+        for (TypeParameter param : n.getTypeParameters()) {
+            SimpleGroovyParameter p = new 
SimpleGroovyParameter(param.getNameAsString());
+            processAnnotations(p, param);
+            p.setType(makeType(param));
+            methOrCons.add(p);
+        }
+    }
+
     @Override
     public void visit(FieldDeclaration f, Object arg) {
         String name = f.getVariable(0).getNameAsString();
diff --git 
a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/GroovyDocTest.java
 
b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/GroovyDocTest.java
index d8343367d3..ae6e5e44bf 100644
--- 
a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/GroovyDocTest.java
+++ 
b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/GroovyDocTest.java
@@ -102,7 +102,7 @@ public class GroovyDocTest {
     }
 
     @Test
-    public void testUnsupportedJavadocVersion() throws Exception {
+    public void testUnsupportedJavadocVersion() {
         rule.executeTarget("unsupportedGroovyDocJava");
 
         final File testfilesPackageDir = new File(tmpDir, 
"org/codehaus/groovy/tools/groovydoc/testfiles/generics");
@@ -113,7 +113,7 @@ public class GroovyDocTest {
     }
 
     @Test
-    public void testInvalidJavaVersion() throws Exception {
+    public void testInvalidJavaVersion() {
         try {
             rule.executeTarget("invalidJavaVersion");
         }
@@ -134,4 +134,19 @@ public class GroovyDocTest {
 
         assertEquals("The generated groovydoc must be in 'UTF-16LE' file 
encoding.'", StandardCharsets.UTF_16LE, charsetToolkit.getCharset());
     }
+
+    @Test
+    public void testJavadocForRecords() throws Exception {
+        rule.executeTarget("testJavadocForRecords");
+
+        final File testfilesPackageDir = new File(tmpDir, 
"org/codehaus/groovy/tools/groovydoc/testfiles/records");
+        final String[] list = testfilesPackageDir.list((file, name) -> 
name.equals("Record.html"));
+
+        assertNotNull("Dir not found: " + 
testfilesPackageDir.getAbsolutePath(), list);
+        assertEquals(1, list.length);
+        File documentedClassHtmlDoc = new File(testfilesPackageDir, list[0]);
+
+        List<String> lines = 
ResourceGroovyMethods.readLines(documentedClassHtmlDoc);
+        assertTrue("\"<title>Record</title>\" not in: " + lines, 
lines.contains("<title>Record</title>"));
+    }
 }
diff --git 
a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/records/Record.java
 
b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/records/Record.java
new file mode 100644
index 0000000000..703609d674
--- /dev/null
+++ 
b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/records/Record.java
@@ -0,0 +1,33 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.tools.groovydoc.testfiles.records;
+
+/**
+ *  Javadoc for a record.
+ */
+public record Record(String recordName)
+{
+    /**
+     * Constructor of a record.
+     * @param recordName The record name.
+     */
+    public Record
+    {
+    }
+}
diff --git 
a/subprojects/groovy-groovydoc/src/test/resources/groovydoc/groovyDocTests.xml 
b/subprojects/groovy-groovydoc/src/test/resources/groovydoc/groovyDocTests.xml
index 8bdff4a7b0..508ecee600 100644
--- 
a/subprojects/groovy-groovydoc/src/test/resources/groovydoc/groovyDocTests.xml
+++ 
b/subprojects/groovy-groovydoc/src/test/resources/groovydoc/groovyDocTests.xml
@@ -96,4 +96,17 @@
             <link packages="org.codehaus.gmaven." 
href="http://groovy.github.io/gmaven/apidocs/"/>
         </groovydoc>
     </target>
+
+    <target name="testJavadocForRecords">
+        <groovydoc destdir="${tmpdir}" sourcepath="${test}"
+                   
packagenames="org/codehaus/groovy/tools/groovydoc/testfiles/**.*"
+                   use="true" windowtitle="GroovyDoc" private="false" 
javaVersion="JAVA_21">
+            <link packages="java.,org.groovy.xml.,javax.,org.groovy.w3c." 
href="http://docs.oracle.com/javase/7/docs/api/"/>
+            <link packages="org.apache.tools.ant." 
href="http://docs.groovy-lang.org/docs/ant/api/"/>
+            <link packages="org.junit.,junit.framework." 
href="http://junit.org/junit4/javadoc/latest/"/>
+            <link packages="groovy.,org.codehaus.groovy." 
href="http://groovy.codehaus.org/api/"/>
+            <link packages="org.codehaus.gmaven." 
href="http://groovy.github.io/gmaven/apidocs/"/>
+        </groovydoc>
+    </target>
+
 </project>

Reply via email to