You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2026/04/25 14:02:26 UTC
(groovy) branch GROOVY-11965 updated (f4ff351933 -> 2f22fe4ad1)
This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a change to branch GROOVY-11965
in repository https://gitbox.apache.org/repos/asf/groovy.git
omit f4ff351933 GROOVY-11965: groovydoc incorrectly includes members declared inside anonymous Java class bodies in the generated documentation of the enclosing class
new 2f22fe4ad1 GROOVY-11965: groovydoc incorrectly includes members declared inside anonymous Java class bodies in the generated documentation of the enclosing class
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (f4ff351933)
\
N -- N -- N refs/heads/GROOVY-11965 (2f22fe4ad1)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../codehaus/groovy/tools/groovydoc/antlr4/GroovydocJavaVisitor.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(groovy) 01/01: GROOVY-11965: groovydoc incorrectly includes members declared inside anonymous Java class bodies in the generated documentation of the enclosing class
Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch GROOVY-11965
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 2f22fe4ad19576b5d6477c6befef9567b8a2f787
Author: Daniel Sun <su...@apache.org>
AuthorDate: Sat Apr 25 20:06:36 2026 +0900
GROOVY-11965: groovydoc incorrectly includes members declared inside anonymous Java class bodies in the generated documentation of the enclosing class
---
.../groovydoc/antlr4/GroovydocJavaVisitor.java | 10 +++++
.../groovy/tools/groovydoc/GroovyDocToolTest.java | 45 +++++++++++++++++++-
.../testfiles/ClassWithAnonymousInnerClass.java | 48 ++++++++++++++++++++--
...rClass.java => JavaEnumWithConstantBodies.java} | 20 ++++++---
4 files changed, 113 insertions(+), 10 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 34b4ef9884..2607c74797 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
@@ -37,6 +37,7 @@ import com.github.javaparser.ast.body.TypeDeclaration;
import com.github.javaparser.ast.comments.JavadocComment;
import com.github.javaparser.ast.expr.AnnotationExpr;
import com.github.javaparser.ast.expr.Name;
+import com.github.javaparser.ast.expr.ObjectCreationExpr;
import com.github.javaparser.ast.nodeTypes.NodeWithAnnotations;
import com.github.javaparser.ast.type.ClassOrInterfaceType;
import com.github.javaparser.ast.type.Type;
@@ -131,6 +132,8 @@ public class GroovydocJavaVisitor
currentClassDoc.addEnumConstant(enumConstantDoc);
processAnnotations(enumConstantDoc, n);
applyJavadocComment(n.getJavadocComment(), enumConstantDoc);
+ // Per-constant class bodies are anonymous implementation details.
+ if (!n.getClassBody().isEmpty()) return;
super.visit(n, arg);
}
@@ -439,6 +442,13 @@ public class GroovydocJavaVisitor
super.visit(f, arg);
}
+ @Override
+ public void visit(ObjectCreationExpr n, Object arg) {
+ // Anonymous class bodies must not contribute members to the enclosing type doc.
+ if (n.getAnonymousClassBody().isPresent()) return;
+ super.visit(n, arg);
+ }
+
public Map<String, GroovyClassDoc> getGroovyClassDocs() {
return classDocs;
}
diff --git a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/GroovyDocToolTest.java b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/GroovyDocToolTest.java
index f340f2d82a..5a304083b2 100644
--- a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/GroovyDocToolTest.java
+++ b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/GroovyDocToolTest.java
@@ -1456,7 +1456,50 @@ public class GroovyDocToolTest extends GroovyTestCase {
xmlTool.renderToOutput(output, MOCK_DIR);
String classWithAnonymousInnerClassDoc = output.getText(MOCK_DIR + "/" + base + ".html");
assertNotNull("No GroovyDoc found for " + base, classWithAnonymousInnerClassDoc);
- assertFalse("innerClassMethod found in: \"" + classWithAnonymousInnerClassDoc + "\"", classWithAnonymousInnerClassDoc.contains("innerClassMethod"));
+ assertTrue("visibleMethod missing from: \"" + classWithAnonymousInnerClassDoc + "\"",
+ classWithAnonymousInnerClassDoc.contains("name=\"visibleMethod\""));
+ assertEquals("Anonymous class getType() leaked into outer doc:\n" + classWithAnonymousInnerClassDoc,
+ 0, StringGroovyMethods.count(classWithAnonymousInnerClassDoc, "name=\"getType\""));
+ assertEquals("Anonymous class getValue() leaked into outer doc:\n" + classWithAnonymousInnerClassDoc,
+ 0, StringGroovyMethods.count(classWithAnonymousInnerClassDoc, "name=\"getValue\""));
+ assertFalse("Anonymous field leaked into outer doc:\n" + classWithAnonymousInnerClassDoc,
+ classWithAnonymousInnerClassDoc.contains("hiddenField"));
+ assertFalse("Anonymous-body local type leaked into outer doc:\n" + classWithAnonymousInnerClassDoc,
+ classWithAnonymousInnerClassDoc.contains("HiddenType"));
+
+ String namedNestedDoc = output.getText(MOCK_DIR + "/" + base + ".NamedNested.html");
+ assertNotNull("Expected GroovyDoc for named nested class " + base + ".NamedNested", namedNestedDoc);
+ assertTrue("visibleNestedMethod missing from named nested doc:\n" + namedNestedDoc,
+ namedNestedDoc.contains("name=\"visibleNestedMethod\""));
+ }
+
+ public void testJavaEnumConstantBodyMethodsNotIncluded() throws Exception {
+ List<String> srcList = new ArrayList<>();
+ String base = "org/codehaus/groovy/tools/groovydoc/testfiles/JavaEnumWithConstantBodies";
+ srcList.add(base + ".java");
+ xmlTool.add(srcList);
+ MockOutputTool output = new MockOutputTool();
+ xmlTool.renderToOutput(output, MOCK_DIR);
+ String javaEnumDoc = output.getText(MOCK_DIR + "/" + base + ".html");
+ assertNotNull("No GroovyDoc found for " + base, javaEnumDoc);
+ assertEquals("Per-constant enum class bodies leaked draw() implementations into enum doc:\n" + javaEnumDoc,
+ 1, StringGroovyMethods.count(javaEnumDoc, "name=\"draw\""));
+ }
+
+ public void testSqlAnonymousParameterImplementationsDoNotLeakIntoClassDoc() throws Exception {
+ GroovyDocTool sqlXmlTool = makeXmlTool(new ArrayList<>(), new Properties(),
+ new String[]{"subprojects/groovy-sql/src/main/java", "../groovy-sql/src/main/java"});
+ sqlXmlTool.add(List.of("groovy/sql/Sql.java"));
+
+ MockOutputTool output = new MockOutputTool();
+ sqlXmlTool.renderToOutput(output, MOCK_DIR);
+
+ String sqlDoc = output.getText(MOCK_DIR + "/groovy/sql/Sql.html");
+ assertNotNull("Expected GroovyDoc for groovy/sql/Sql", sqlDoc);
+ assertEquals("Sql doc should not expose getType() from anonymous parameter implementations:\n" + sqlDoc,
+ 0, StringGroovyMethods.count(sqlDoc, "name=\"getType\""));
+ assertEquals("Sql doc should not expose getValue() from anonymous parameter implementations:\n" + sqlDoc,
+ 0, StringGroovyMethods.count(sqlDoc, "name=\"getValue\""));
}
public void testJavaClassWithDiamondOperator() throws Exception {
diff --git a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/ClassWithAnonymousInnerClass.java b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/ClassWithAnonymousInnerClass.java
index a029a8b84a..64ed80f181 100644
--- a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/ClassWithAnonymousInnerClass.java
+++ b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/ClassWithAnonymousInnerClass.java
@@ -19,10 +19,52 @@
package org.codehaus.groovy.tools.groovydoc.testfiles;
public class ClassWithAnonymousInnerClass {
-}
+ private final Supplier anonymous = new Supplier() {
+ private final String hiddenField = "hidden";
+
+ @Override
+ public int getType() {
+ return hiddenField.length();
+ }
+
+ @Override
+ public Object getValue() {
+ return hiddenField;
+ }
+
+ class HiddenType {
+ Object reveal() {
+ return hiddenField;
+ }
+ }
+ };
+
+ public Supplier inout(final Supplier supplier) {
+ return new Supplier() {
+ @Override
+ public int getType() {
+ return supplier.getType();
+ }
-class AnonymusInnerClass {
+ @Override
+ public Object getValue() {
+ return supplier.getValue();
+ }
+ };
+ }
+
+ public int visibleMethod() {
+ return anonymous.getType();
+ }
+
+ public static class NamedNested {
+ public String visibleNestedMethod() {
+ return "visible";
+ }
+ }
- public void innerClassMethod(){
+ public interface Supplier {
+ int getType();
+ Object getValue();
}
}
diff --git a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/ClassWithAnonymousInnerClass.java b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/JavaEnumWithConstantBodies.java
similarity index 75%
copy from subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/ClassWithAnonymousInnerClass.java
copy to subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/JavaEnumWithConstantBodies.java
index a029a8b84a..6b6824d6d2 100644
--- a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/ClassWithAnonymousInnerClass.java
+++ b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/JavaEnumWithConstantBodies.java
@@ -18,11 +18,19 @@
*/
package org.codehaus.groovy.tools.groovydoc.testfiles;
-public class ClassWithAnonymousInnerClass {
-}
-
-class AnonymusInnerClass {
+public enum JavaEnumWithConstantBodies {
+ FIRST {
+ @Override
+ public String draw() {
+ return "first";
+ }
+ },
+ SECOND {
+ @Override
+ public String draw() {
+ return "second";
+ }
+ };
- public void innerClassMethod(){
- }
+ public abstract String draw();
}