This is an automated email from the ASF dual-hosted git repository.
sunlan pushed a commit to branch GROOVY_5_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/GROOVY_5_0_X by this push:
new 91cbffd0ea GROOVY-11755: Support groovydoc for records (#2290)
91cbffd0ea is described below
commit 91cbffd0eabe68f37d1bb902348b1b429cec141d
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]>
(cherry picked from commit 3fa8defe5733ad97e0d47489a78bdebcdb877492)
---
.../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>