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

paulk 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 19b3bd96ff GROOVY-11668: Support specifying the Java source file 
version for groovydoc
19b3bd96ff is described below

commit 19b3bd96ff4e8f498789957d1cd06b449588cba1
Author: James Daugherty <[email protected]>
AuthorDate: Sun May 18 00:47:55 2025 -0400

    GROOVY-11668: Support specifying the Java source file version for groovydoc
---
 .../groovy/org.apache.groovy-asciidoctor.gradle    |  1 +
 src/bin/groovydoc_completion                       |  2 +-
 .../java/org/codehaus/groovy/ant/Groovydoc.java    | 11 +++
 .../codehaus/groovy/tools/groovydoc/Main.groovy    |  5 +-
 .../groovy/tools/groovydoc/GroovyDocTool.java      | 54 +++++++++++++-
 .../groovy/tools/groovydoc/Main.properties         |  4 +-
 .../groovy-groovydoc/src/spec/doc/groovydoc.adoc   |  6 ++
 .../groovy/tools/groovydoc/GroovyDocTest.java      | 38 ++++++++++
 .../groovy/tools/groovydoc/GroovyDocToolTest.java  | 84 ++++++++++++++++++++--
 .../test/resources/groovydoc/groovyDocTests.xml    | 36 ++++++++++
 10 files changed, 228 insertions(+), 13 deletions(-)

diff --git a/build-logic/src/main/groovy/org.apache.groovy-asciidoctor.gradle 
b/build-logic/src/main/groovy/org.apache.groovy-asciidoctor.gradle
index 2acbfec035..f37f4bff22 100644
--- a/build-logic/src/main/groovy/org.apache.groovy-asciidoctor.gradle
+++ b/build-logic/src/main/groovy/org.apache.groovy-asciidoctor.gradle
@@ -73,6 +73,7 @@ asciidoctor {
             'groovy-patch-version': patch,
             'groovy-full-version': groovyVersion,
             'groovy-short-version': "${major}.${minor}",
+            'javaParserVersion': versions.javaParser,
             doctype: 'book',
             revnumber: groovyVersion,
             icons: 'font',
diff --git a/src/bin/groovydoc_completion b/src/bin/groovydoc_completion
index afcdfc3e3d..28d8edf084 100644
--- a/src/bin/groovydoc_completion
+++ b/src/bin/groovydoc_completion
@@ -91,7 +91,7 @@ function _picocli_groovydoc() {
 
   COMMANDS=""
   FLAG_OPTS="-h -help --help --version -verbose -quiet --debug -classpath -cp 
--classpath -author -noscripts -nomainforscripts -notimestamp -noversionstamp 
-public -protected -package -private"
-  ARG_OPTS="-d --destdir -overview -charset -fileEncoding -windowtitle 
-doctitle -header -footer -exclude -stylesheetfile -sourcepath"
+  ARG_OPTS="-d --destdir -overview -charset -fileEncoding -windowtitle 
-doctitle -header -footer -exclude -stylesheetfile -sourcepath -javaversion"
 
   COMPREPLY=( $(compgen -W "${FLAG_OPTS} ${ARG_OPTS} ${COMMANDS}" -- 
${CURR_WORD}) )
 }
diff --git 
a/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovydoc.java 
b/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovydoc.java
index 865b71ae98..26b08f640c 100644
--- 
a/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovydoc.java
+++ 
b/subprojects/groovy-ant/src/main/java/org/codehaus/groovy/ant/Groovydoc.java
@@ -64,6 +64,7 @@ public class Groovydoc extends Task {
     private boolean includeNoSourcePackages;
     private Boolean noTimestamp;
     private Boolean noVersionStamp;
+    private String javaVersion;
     private final List<DirSet> packageSets;
     private final List<String> sourceFilesToDoc;
     private final List<LinkArgument> links = new ArrayList<>();
@@ -144,6 +145,15 @@ public class Groovydoc extends Task {
         this.noVersionStamp = noVersionStamp;
     }
 
+    /**
+     * Defaults to a popular Java version defined by the JavaParser library. 
Otherwise, override here for a specific expected source file version.
+     *
+     * @param javaVersion the expected source level of any Java files that may 
be parsed; i.e. JAVA_11
+     */
+    public void setJavaVersion(String javaVersion) {
+        this.javaVersion = javaVersion;
+    }
+
     /**
      * If set to false, Scripts will not be processed.
      * Defaults to true.
@@ -466,6 +476,7 @@ public class Groovydoc extends Task {
                 getPackageTemplates(),
                 getClassTemplates(),
                 links,
+                javaVersion,
                 properties
         );
 
diff --git 
a/subprojects/groovy-groovydoc/src/main/groovy/org/codehaus/groovy/tools/groovydoc/Main.groovy
 
b/subprojects/groovy-groovydoc/src/main/groovy/org/codehaus/groovy/tools/groovydoc/Main.groovy
index d0079b1a99..1ccc2c024b 100644
--- 
a/subprojects/groovy-groovydoc/src/main/groovy/org/codehaus/groovy/tools/groovydoc/Main.groovy
+++ 
b/subprojects/groovy-groovydoc/src/main/groovy/org/codehaus/groovy/tools/groovydoc/Main.groovy
@@ -51,6 +51,7 @@ class Main {
     private static Boolean protectedScope
     private static Boolean debug = false
     private static String[] sourcepath
+    private static String javaVersion
     private static List<String> sourceFilesToDoc
     private static List<String> remainingArgs
     private static List<String> exclusions
@@ -90,6 +91,7 @@ class Main {
         cli.exclude(args:1, argName: 'pkglist', 
messages['cli.option.exclude.description'])
         cli.stylesheetfile(args:1, argName: 'path', 
messages['cli.option.stylesheetfile.description'])
         cli.sourcepath(args:1, argName: 'pathlist', 
messages['cli.option.sourcepath.description'])
+        cli.javaVersion(args: 1, argName: 'javaVersion', 
messages['cli.option.javaVersion.description'])
 
         def options = cli.parse(args)
 
@@ -125,6 +127,7 @@ class Main {
             sourcepath = list.toArray()
         }
 
+        javaVersion = options.javaVersion
         author = Boolean.valueOf(options.author) ?: false
         noScripts = Boolean.valueOf(options.noscripts) ?: false
         noMainForScripts = Boolean.valueOf(options.nomainforscripts) ?: false
@@ -204,7 +207,6 @@ class Main {
         String phaseOverride = 
SystemUtil.getSystemPropertySafe("groovydoc.phase.override")
         if (phaseOverride) properties.put("phaseOverride", phaseOverride)
 
-
         def links = new ArrayList<LinkArgument>();
         collectSourceFileNames(remainingArgs, sourcepath, exclusions)
         GroovyDocTool htmlTool = new GroovyDocTool(
@@ -214,6 +216,7 @@ class Main {
                 GroovyDocTemplateInfo.DEFAULT_PACKAGE_TEMPLATES,
                 GroovyDocTemplateInfo.DEFAULT_CLASS_TEMPLATES,
                 links,
+                javaVersion,
                 properties
         )
 
diff --git 
a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/GroovyDocTool.java
 
b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/GroovyDocTool.java
index 62ad50b8c7..30848e900d 100644
--- 
a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/GroovyDocTool.java
+++ 
b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/GroovyDocTool.java
@@ -18,6 +18,8 @@
  */
 package org.codehaus.groovy.tools.groovydoc;
 
+import com.github.javaparser.ParserConfiguration;
+import com.github.javaparser.StaticJavaParser;
 import org.codehaus.groovy.groovydoc.GroovyRootDoc;
 import org.codehaus.groovy.tools.shell.util.Logger;
 
@@ -26,12 +28,15 @@ import java.io.IOException;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.Properties;
+import java.util.function.Predicate;
 
 public class GroovyDocTool {
     private final Logger log = Logger.create(GroovyDocTool.class);
     private final GroovyRootDocBuilder rootDocBuilder;
     private final GroovyDocTemplateEngine templateEngine;
+    private final ParserConfiguration.LanguageLevel javaLanguageLevel;
 
     protected Properties properties;
 
@@ -45,11 +50,24 @@ public class GroovyDocTool {
     }
 
     public GroovyDocTool(ResourceManager resourceManager, String[] 
sourcepaths, String classTemplate) {
-        this(resourceManager, sourcepaths, new String[]{}, new String[]{}, new 
String[]{classTemplate}, new ArrayList<LinkArgument>(), new Properties());
+        this(resourceManager, sourcepaths, new String[]{}, new String[]{}, new 
String[]{classTemplate}, new ArrayList<LinkArgument>(), null, new Properties());
     }
 
-    public GroovyDocTool(ResourceManager resourceManager, String[] 
sourcepaths, String[] docTemplates, String[] packageTemplates, String[] 
classTemplates, List<LinkArgument> links, Properties properties) {
+    /**
+     * Constructs a GroovyDocTool instance with the specified parameters.
+     *
+     * @param resourceManager  the resource manager for handling resources, or 
null if not required
+     * @param sourcepaths      the paths to the source files to be processed
+     * @param docTemplates     the templates for generating documentation
+     * @param packageTemplates the templates for generating package-level 
documentation
+     * @param classTemplates   the templates for generating class-level 
documentation
+     * @param links            a list of link arguments for external references
+     * @param javaVersion      the Java version to be used for parsing and 
processing Java source files
+     * @param properties       additional properties to be used when 
generating the groovydoc
+     */
+    public GroovyDocTool(ResourceManager resourceManager, String[] 
sourcepaths, String[] docTemplates, String[] packageTemplates, String[] 
classTemplates, List<LinkArgument> links, String javaVersion, Properties 
properties) {
         rootDocBuilder = new GroovyRootDocBuilder(sourcepaths, links, 
properties);
+        javaLanguageLevel = calculateLanguageLevel(javaVersion);
 
         String defaultCharset = Charset.defaultCharset().name();
 
@@ -71,12 +89,42 @@ public class GroovyDocTool {
         }
     }
 
+    private ParserConfiguration.LanguageLevel calculateLanguageLevel(String 
javaVersion) {
+        String version = Optional.ofNullable(javaVersion)
+            .map(String::trim)
+            .map(s -> s.toUpperCase())
+            .filter(s -> !s.isEmpty())
+            .orElse(null);
+
+        if (version == null) {
+            return null;
+        }
+
+        try {
+            return ParserConfiguration.LanguageLevel.valueOf(version);
+        } catch (IllegalArgumentException e) {
+            throw new IllegalArgumentException("Unsupported Java Version: " + 
javaVersion);
+        }
+    }
+
     public void add(List<String> filenames) throws IOException {
         if (templateEngine != null) {
             // only print out if we are being used for template generation
             log.debug("Loading source files for " + filenames);
         }
-        rootDocBuilder.buildTree(filenames);
+
+        ParserConfiguration.LanguageLevel previousLanguageLevel = 
StaticJavaParser.getParserConfiguration().getLanguageLevel();
+        try {
+            if(javaLanguageLevel != null) {
+                
StaticJavaParser.getParserConfiguration().setLanguageLevel(javaLanguageLevel);
+            }
+            rootDocBuilder.buildTree(filenames);
+        }
+        finally {
+            if(javaLanguageLevel != null) {
+                
StaticJavaParser.getParserConfiguration().setLanguageLevel(previousLanguageLevel);
+            }
+        }
     }
 
     public GroovyRootDoc getRootDoc() {
diff --git 
a/subprojects/groovy-groovydoc/src/main/resources/org/codehaus/groovy/tools/groovydoc/Main.properties
 
b/subprojects/groovy-groovydoc/src/main/resources/org/codehaus/groovy/tools/groovydoc/Main.properties
index e3dcdc8053..bcbb6a5ffe 100644
--- 
a/subprojects/groovy-groovydoc/src/main/resources/org/codehaus/groovy/tools/groovydoc/Main.properties
+++ 
b/subprojects/groovy-groovydoc/src/main/resources/org/codehaus/groovy/tools/groovydoc/Main.properties
@@ -76,4 +76,6 @@ cli.option.sourcepath.description=Specify where to find 
source files (dirs separ
 
 cli.option.exclude.description=Specify a list of packages to exclude 
(separated by colons for all operating systems)
 
-cli.info.version=@|green GroovyDoc|@ {0}
\ No newline at end of file
+cli.option.javaVersion.description=Specify the Java Version for parsed java 
files (i.e. JAVA_11)
+
+cli.info.version=@|green GroovyDoc|@ {0}
diff --git a/subprojects/groovy-groovydoc/src/spec/doc/groovydoc.adoc 
b/subprojects/groovy-groovydoc/src/spec/doc/groovydoc.adoc
index ca44a81cfb..aaddfe293e 100644
--- a/subprojects/groovy-groovydoc/src/spec/doc/groovydoc.adoc
+++ b/subprojects/groovy-groovydoc/src/spec/doc/groovydoc.adoc
@@ -70,8 +70,13 @@ separated by platform path separator)
 |-verbose| |Enable verbose output
 | |--version|Display the version
 |-windowtitle <text>| |Browser window title for the documentation
+|-javaversion <version> | | The version of the Java source files
 |=======================================================================
 
+=== Java Versions
+
+The supported Java Versions for `groovydoc` are defined by the JavaParser 
library's 
link:https://www.javadoc.io/doc/com.github.javaparser/javaparser-core/{javaParserVersion}/com/github/javaparser/ParserConfiguration.LanguageLevel.html[LanguageLevel]
 class.
+
 [[Groovydoc-Ant]]
 == The groovydoc Ant task
 
@@ -110,6 +115,7 @@ wildcard). |No
 |overview |Read overview documentation from HTML file. |No
 |private |Show all classes and members (i.e. including private ones) if
 set to ``true''. |No
+|javaversion |The version of the Java source files. |No
 |=======================================================================
 
 [[ThegroovydocAnttask-groovydocNestedElements]]
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 cf76cdbe20..d8343367d3 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
@@ -19,6 +19,7 @@
 package org.codehaus.groovy.tools.groovydoc;
 
 import groovy.util.CharsetToolkit;
+import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.BuildFileRule;
 import org.codehaus.groovy.runtime.ResourceGroovyMethods;
 import org.junit.After;
@@ -84,6 +85,43 @@ public class GroovyDocTest {
         assertTrue("\"This is a custom class template.\" not in: " + lines, 
lines.contains("This is a custom class template."));
     }
 
+    @Test
+    public void testSupportedJavadocVersion() throws Exception {
+        rule.executeTarget("supportedGroovyDocJava");
+
+        final File testfilesPackageDir = new File(tmpDir, 
"org/codehaus/groovy/tools/groovydoc/testfiles/generics");
+        final String[] list = testfilesPackageDir.list((file, name) -> 
name.equals("Java.html"));
+
+        assertNotNull("Dir not found: " + 
testfilesPackageDir.getAbsolutePath(), list);
+        assertEquals(1, list.length);
+        File documentedClass = new File(testfilesPackageDir, list[0]);
+        assertTrue("Java.html not found: " + 
documentedClass.getAbsolutePath(), documentedClass.exists());
+
+        List<String> lines = ResourceGroovyMethods.readLines(documentedClass);
+        assertTrue("\"<title>Java</title>\" not in: " + lines, 
lines.contains("<title>Java</title>"));
+    }
+
+    @Test
+    public void testUnsupportedJavadocVersion() throws Exception {
+        rule.executeTarget("unsupportedGroovyDocJava");
+
+        final File testfilesPackageDir = new File(tmpDir, 
"org/codehaus/groovy/tools/groovydoc/testfiles/generics");
+        final String[] list = testfilesPackageDir.list((file, name) -> 
name.equals("Java.html"));
+
+        assertNotNull("Dir not found: " + 
testfilesPackageDir.getAbsolutePath(), list);
+        assertEquals("Files unexpectedly found when not expecting to parse",0, 
list.length);
+    }
+
+    @Test
+    public void testInvalidJavaVersion() throws Exception {
+        try {
+            rule.executeTarget("invalidJavaVersion");
+        }
+        catch(BuildException e) {
+            assertEquals("java.lang.IllegalArgumentException: Unsupported Java 
Version: DNE", e.getMessage());
+        }
+    }
+
     @Test
     public void testFileEncoding() throws Exception {
         rule.executeTarget("testFileEncoding");
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 a01c60b75c..b053c1b086 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
@@ -18,6 +18,8 @@
  */
 package org.codehaus.groovy.tools.groovydoc;
 
+import com.github.javaparser.ParserConfiguration;
+import com.github.javaparser.StaticJavaParser;
 import groovy.test.GroovyTestCase;
 import org.codehaus.groovy.groovydoc.GroovyClassDoc;
 import org.codehaus.groovy.groovydoc.GroovyMethodDoc;
@@ -25,6 +27,8 @@ import org.codehaus.groovy.groovydoc.GroovyRootDoc;
 import org.codehaus.groovy.runtime.StringGroovyMethods;
 import 
org.codehaus.groovy.tools.groovydoc.gstringTemplates.GroovyDocTemplateInfo;
 
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -55,7 +59,11 @@ public class GroovyDocToolTest extends GroovyTestCase {
         link.setPackages("java.,org.xml.,javax.,org.xml.");
         links.add(link);
 
-        htmlTool = makeHtmltool(links, new Properties());
+        htmlTool = makeHtmltool(links, null, new Properties());
+    }
+
+    public void tearDown() {
+        StaticJavaParser.getParserConfiguration().setLanguageLevel(null);
     }
 
     private GroovyDocTool makeXmlTool(ArrayList<LinkArgument> links, 
Properties props) {
@@ -70,11 +78,12 @@ public class GroovyDocToolTest extends GroovyTestCase {
                 new String[]{TEMPLATES_DIR + 
"/packageLevel/packageDocStructuredData.xml"},
                 new String[]{TEMPLATES_DIR + 
"/classLevel/classDocStructuredData.xml"},
                 links,
+     null,
                 props
         );
     }
 
-    private GroovyDocTool makeHtmltool(ArrayList<LinkArgument> links, 
Properties props) {
+    private GroovyDocTool makeHtmltool(ArrayList<LinkArgument> links, String 
javaVersion, Properties props) {
         return new GroovyDocTool(
                 new FileSystemResourceManager("src/main/resources"), // 
template storage
                 new String[] {"src/test/groovy", "../../src/test/groovy"}, // 
source file dirs
@@ -82,6 +91,7 @@ public class GroovyDocToolTest extends GroovyTestCase {
                 GroovyDocTemplateInfo.DEFAULT_PACKAGE_TEMPLATES,
                 GroovyDocTemplateInfo.DEFAULT_CLASS_TEMPLATES,
                 links,
+                javaVersion,
                 props
         );
     }
@@ -435,7 +445,7 @@ public class GroovyDocToolTest extends GroovyTestCase {
     }
 
     private void testPropertiesFromGetterSetter(String fileName, String 
assertMessage,String expected,boolean isTrue) throws Exception {
-        htmlTool = makeHtmltool(new ArrayList<>(), new Properties());
+        htmlTool = makeHtmltool(new ArrayList<>(), null, new Properties());
         List<String> srcList = new ArrayList<>();
         String base = "org/codehaus/groovy/tools/groovydoc/testfiles/";
         srcList.add(base + fileName + ".groovy");
@@ -450,7 +460,7 @@ public class GroovyDocToolTest extends GroovyTestCase {
     }
 
     private void testVisibility(Properties props, boolean a, boolean b, 
boolean c, boolean d) throws Exception {
-        htmlTool = makeHtmltool(new ArrayList<>(), props);
+        htmlTool = makeHtmltool(new ArrayList<>(), null, props);
         List<String> srcList = new ArrayList<>();
         String base = 
"org/codehaus/groovy/tools/groovydoc/testfiles/ExampleVisibility";
         srcList.add(base + "G.groovy");
@@ -531,6 +541,7 @@ public class GroovyDocToolTest extends GroovyTestCase {
                 new String[0],
                 new String[0],
                 new ArrayList<>(),
+     null,
                 props);
 
         assertEquals("'fileEncoding' falls back to 'charset' if not provided", 
expectedCharset, tool.properties.getProperty("fileEncoding"));
@@ -549,6 +560,7 @@ public class GroovyDocToolTest extends GroovyTestCase {
                 new String[0],
                 new String[0],
                 new ArrayList<>(),
+                null,
                 props);
 
         assertEquals("'charset' falls back to 'fileEncoding' if not provided", 
expectedCharset, tool.properties.getProperty("charset"));
@@ -565,6 +577,7 @@ public class GroovyDocToolTest extends GroovyTestCase {
                 new String[0],
                 new String[0],
                 new ArrayList<>(),
+                null,
                 new Properties());
 
         assertEquals("'charset' falls back to the default charset", 
expectedCharset, tool.properties.getProperty("charset"));
@@ -1024,6 +1037,63 @@ public class GroovyDocToolTest extends GroovyTestCase {
         assertTrue("The Groovy derived class declaration header should match 
in:\n" + groovyDerivedClass, derivedClass.matcher(groovyDerivedClass).find());
     }
 
+    public void testLanguageLevelNotSupported() throws Exception {
+        htmlTool = makeHtmltool(new ArrayList<LinkArgument>(), 
ParserConfiguration.LanguageLevel.JAVA_1_4.name(), new Properties());
+
+        final String base = 
"org/codehaus/groovy/tools/groovydoc/testfiles/generics";
+
+        PrintStream originalSystemErr = System.err;
+        ByteArrayOutputStream systemErr = new ByteArrayOutputStream();
+        try {
+            System.setErr(new PrintStream(systemErr));
+            htmlTool.add(Arrays.asList(
+                base + "/Java.java"
+            ));
+        }
+        finally {
+            System.setErr(originalSystemErr);
+        }
+        final String errorMessage = systemErr.toString();
+        System.err.println(errorMessage);
+
+        final MockOutputTool output = new MockOutputTool();
+        htmlTool.renderToOutput(output, MOCK_DIR);
+
+        final String javadoc = output.getText(MOCK_DIR + "/" + base + 
"/Java.html");
+        assertNull("Javadoc should be null since language level is not 
supported", javadoc);
+
+        assertTrue("Expected to find Java file in error message", 
errorMessage.contains("org/codehaus/groovy/tools/groovydoc/testfiles/generics/Java.java"));
+        assertTrue("Expected to find language level not supported", 
errorMessage.contains("Pay attention that this feature is supported starting 
from"));
+    }
+
+    public void testLanguageLevelSupported() throws Exception {
+        htmlTool = makeHtmltool(new ArrayList<LinkArgument>(), 
ParserConfiguration.LanguageLevel.JAVA_5.name(), new Properties());
+
+        final String base = 
"org/codehaus/groovy/tools/groovydoc/testfiles/generics";
+
+        PrintStream originalSystemErr = System.err;
+        ByteArrayOutputStream systemErr = new ByteArrayOutputStream();
+        try {
+            System.setErr(new PrintStream(systemErr));
+            htmlTool.add(Arrays.asList(
+                base + "/Java.java"
+            ));
+        }
+        finally {
+            System.setErr(originalSystemErr);
+        }
+        final String errorMessage = systemErr.toString();
+        System.err.println(errorMessage);
+
+        final MockOutputTool output = new MockOutputTool();
+        htmlTool.renderToOutput(output, MOCK_DIR);
+
+        final String javadoc = output.getText(MOCK_DIR + "/" + base + 
"/Java.html");
+        assertNotNull("Javadoc should not be null since language level is 
supported", javadoc);
+
+        assertTrue("Expected no error output", errorMessage.isEmpty());
+    }
+
     public void testJavaGenericsTitle() throws Exception {
         final String base = 
"org/codehaus/groovy/tools/groovydoc/testfiles/generics";
         htmlTool.add(List.of(base + "/Java.java"));
@@ -1154,7 +1224,7 @@ public class GroovyDocToolTest extends GroovyTestCase {
         final String base = 
"org/codehaus/groovy/tools/groovydoc/testfiles/anno";
         Properties props = new Properties();
         props.put("phaseOverride", "7");
-        htmlTool = makeHtmltool(new ArrayList<>(), props);
+        htmlTool = makeHtmltool(new ArrayList<>(), null, props);
         htmlTool.add(Arrays.asList(
                 base + "/Groovy.groovy",
                 base + "/Java.java"
@@ -1422,7 +1492,7 @@ public class GroovyDocToolTest extends GroovyTestCase {
         // -noscript case
         Properties props = new Properties();
         props.put("processScripts", "false");
-        htmlTool = makeHtmltool(new ArrayList<>(), props);
+        htmlTool = makeHtmltool(new ArrayList<>(), null, props);
         htmlTool.add(srcList);
         output = new MockOutputTool();
         htmlTool.renderToOutput(output, MOCK_DIR);
@@ -1432,7 +1502,7 @@ public class GroovyDocToolTest extends GroovyTestCase {
         // -nomainforscript case
         props = new Properties();
         props.put("includeMainForScripts", "false");
-        htmlTool = makeHtmltool(new ArrayList<>(), props);
+        htmlTool = makeHtmltool(new ArrayList<>(), null, props);
         htmlTool.add(srcList);
         output = new MockOutputTool();
         htmlTool.renderToOutput(output, MOCK_DIR);
diff --git 
a/subprojects/groovy-groovydoc/src/test/resources/groovydoc/groovyDocTests.xml 
b/subprojects/groovy-groovydoc/src/test/resources/groovydoc/groovyDocTests.xml
index 097a9816d8..8bdff4a7b0 100644
--- 
a/subprojects/groovy-groovydoc/src/test/resources/groovydoc/groovyDocTests.xml
+++ 
b/subprojects/groovy-groovydoc/src/test/resources/groovydoc/groovyDocTests.xml
@@ -43,6 +43,42 @@
         </groovydoc>
     </target>
 
+    <target name="unsupportedGroovyDocJava">
+        <groovydoc destdir="${tmpdir}" sourcepath="${test}"
+                   
packagenames="org/codehaus/groovy/tools/groovydoc/testfiles/**.*"
+                   use="true" windowtitle="GroovyDoc" private="false" 
javaVersion="JAVA_1_4">
+            <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>
+
+    <target name="supportedGroovyDocJava">
+        <groovydoc destdir="${tmpdir}" sourcepath="${test}"
+                   
packagenames="org/codehaus/groovy/tools/groovydoc/testfiles/**.*"
+                   use="true" windowtitle="GroovyDoc" private="false" 
javaVersion="JAVA_5">
+            <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>
+
+    <target name="invalidJavaVersion">
+        <groovydoc destdir="${tmpdir}" sourcepath="${test}"
+                   
packagenames="org/codehaus/groovy/tools/groovydoc/testfiles/**.*"
+                   use="true" windowtitle="GroovyDoc" private="false" 
javaVersion="DNE">
+            <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>
+
     <target name="testFileEncoding">
         <groovydoc
                 destdir="${tmpdir}"

Reply via email to