This is an automated email from the ASF dual-hosted git repository. paulk pushed a commit to branch GROOVY_4_0_X in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 6b30f5b157deb15d585219f95bc466db528dab10 Author: Stephane Talbot <[email protected]> AuthorDate: Sun Apr 24 18:24:39 2022 +0200 GROOVY-10593: add new test cases and bugfix for static imports --- .../tools/groovydoc/SimpleGroovyClassDoc.java | 25 +++++++-- .../groovy/tools/groovydoc/GroovyDocToolTest.java | 63 ++++++++++++++++++++++ .../groovy_10593/b/TestStaticAlias.groovy | 5 ++ .../testfiles/groovy_10593/b/TestStaticStar.groovy | 5 ++ .../testfiles/groovy_10593/b/TestStaticStar.java | 5 ++ 5 files changed, 99 insertions(+), 4 deletions(-) diff --git a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDoc.java b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDoc.java index 99f2dfcbfe..7b08abcdf1 100644 --- a/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDoc.java +++ b/subprojects/groovy-groovydoc/src/main/java/org/codehaus/groovy/tools/groovydoc/SimpleGroovyClassDoc.java @@ -18,6 +18,9 @@ */ package org.codehaus.groovy.tools.groovydoc; +import com.github.javaparser.ast.expr.Name; +import com.github.javaparser.JavaParser; + import org.codehaus.groovy.groovydoc.GroovyAnnotationRef; import org.codehaus.groovy.groovydoc.GroovyClassDoc; import org.codehaus.groovy.groovydoc.GroovyConstructorDoc; @@ -38,6 +41,7 @@ import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.StringTokenizer; import java.util.regex.Matcher; @@ -682,11 +686,24 @@ public class SimpleGroovyClassDoc extends SimpleGroovyAbstractableElementDoc imp private GroovyClassDoc resolveInternalClassDocFromImport(GroovyRootDoc rootDoc, String baseName) { if (isPrimitiveType(baseName)) return null; for (String importName : importedClassesAndPackages) { - if (importName.endsWith("/" + baseName)) { - GroovyClassDoc doc = ((SimpleGroovyRootDoc)rootDoc).classNamedExact(importName); - if (doc != null) return doc; + String targetClassName = null; + if (aliases.containsKey(baseName)) { + targetClassName = aliases.get(baseName); + } else if (importName.endsWith("/" + baseName)) { + targetClassName = importName; } else if (importName.endsWith("/*")) { - GroovyClassDoc doc = ((SimpleGroovyRootDoc)rootDoc).classNamedExact(importName.substring(0, importName.length() - 1) + baseName); + targetClassName = importName.substring(0, importName.length() - 1) + baseName; + } + // need this for correct resolution of static imports + if (targetClassName != null){ + GroovyClassDoc doc = null; + Optional<Name> name = new JavaParser().parseName(targetClassName.replace('/','.')).getResult(); + String staticPart = ""; + while (doc == null && name.isPresent()) { + doc = ((SimpleGroovyRootDoc)rootDoc).classNamedExact(name.get().asString().replace('.','/')+staticPart); + staticPart = "."+name.get().getIdentifier()+staticPart; + name = name.get().getQualifier(); + } if (doc != null) return doc; } } 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 1443fe7c5a..81f405831e 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 @@ -877,6 +877,69 @@ public class GroovyDocToolTest extends GroovyTestCase { assertEquals("Classes from imported packages should shadow classes from default packages", "StaticList.List", extendedClass.group(5)); } + public void testGroovyExtendsStaticImportedAliasesClassWithNameWhichExistInDefaultPackages() throws Exception { + // Groovy interface b.TestStatic imports a.StaticList.ListAlias as List and extends List. + // List should be recognized as a.StaticList.List and not java.util.List + htmlTool.add(Arrays.asList( + "org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/a/StaticList.java", + "org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticAlias.groovy" + )); + + final MockOutputTool output = new MockOutputTool(); + htmlTool.renderToOutput(output, MOCK_DIR); + final String testAdapterDoc = output.getText(MOCK_DIR + "/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticAlias.html"); + + // TestStatic should etends a.StaticList.List + final Matcher extendedClass = Pattern.compile("extends\\s+<a[^>]*href='[^']*(((java/util/)|(a/StaticList\\.))List(Alias)?)\\.html'[^>]*>((StaticList\\.)?List(Alias)?)</a>").matcher(testAdapterDoc); + + assertTrue("TestStatic interface should extends List", extendedClass.find()); + + assertEquals("Classes from imported packages should shadow classes from default packages", "a/StaticList.ListAlias", extendedClass.group(1)); + assertEquals("Classes from imported packages should shadow classes from default packages", "StaticList.ListAlias", extendedClass.group(6)); + } + + public void testGroovyExtendsStaticStarImportedClassWithNameWhichExistInDefaultPackages() throws Exception { + // Groovy interface b.TestStaticStar imports a.StaticList.* and extends List. + // List should be recognized as a.StaticList.List and not java.util.List + htmlTool.add(Arrays.asList( + "org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/a/StaticList.java", + "org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.groovy" + )); + + final MockOutputTool output = new MockOutputTool(); + htmlTool.renderToOutput(output, MOCK_DIR); + final String testAdapterDoc = output.getText(MOCK_DIR + "/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.html"); + + // TestStatic should etends a.StaticList.List + final Matcher extendedClass = Pattern.compile("extends\\s+<a[^>]*href='[^']*(((java/util/)|(a/StaticList\\.))List)\\.html'[^>]*>((StaticList\\.)?List)</a>").matcher(testAdapterDoc); + + assertTrue("TestStaticStar interface should extends List", extendedClass.find()); + + assertEquals("Classes from imported packages should shadow classes from default packages", "a/StaticList.List", extendedClass.group(1)); + assertEquals("Classes from imported packages should shadow classes from default packages", "StaticList.List", extendedClass.group(5)); + } + + public void testJavaExtendsStaticStarImportedClassWithNameWhichExistInDefaultPackages() throws Exception { + // Java interface b.TestStaticStar imports a.StaticList.* and extends List. + // List should be recognized as a.StaticList.List and not java.util.List + htmlTool.add(Arrays.asList( + "org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/a/StaticList.java", + "org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.groovy" + )); + + final MockOutputTool output = new MockOutputTool(); + htmlTool.renderToOutput(output, MOCK_DIR); + final String testAdapterDoc = output.getText(MOCK_DIR + "/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.html"); + + // TestStatic should etends a.StaticList.List + final Matcher extendedClass = Pattern.compile("extends\\s+<a[^>]*href='[^']*(((java/util/)|(a/StaticList\\.))List)\\.html'[^>]*>((StaticList\\.)?List)</a>").matcher(testAdapterDoc); + + assertTrue("TestStaticStar interface should extends List", extendedClass.find()); + + assertEquals("Classes from imported packages should shadow classes from default packages", "a/StaticList.List", extendedClass.group(1)); + assertEquals("Classes from imported packages should shadow classes from default packages", "StaticList.List", extendedClass.group(5)); + } + public void testClassDeclarationHeader() throws Exception { final String base = "org/codehaus/groovy/tools/groovydoc/testfiles"; htmlTool.add(Arrays.asList( diff --git a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticAlias.groovy b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticAlias.groovy new file mode 100644 index 0000000000..6581668afa --- /dev/null +++ b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticAlias.groovy @@ -0,0 +1,5 @@ +package org.codehaus.groovy.tools.groovydoc.testfiles.groovy_10593.b; + +import org.codehaus.groovy.tools.groovydoc.testfiles.groovy_10593.a.StaticList.ListAlias as List; + +public interface TestStaticAlias extends List {} \ No newline at end of file diff --git a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.groovy b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.groovy new file mode 100644 index 0000000000..7a5b294160 --- /dev/null +++ b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.groovy @@ -0,0 +1,5 @@ +package org.codehaus.groovy.tools.groovydoc.testfiles.groovy_10593.b; + +import org.codehaus.groovy.tools.groovydoc.testfiles.groovy_10593.a.StaticList.*; + +public interface TestStaticStar extends List {} \ No newline at end of file diff --git a/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.java b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.java new file mode 100644 index 0000000000..7a5b294160 --- /dev/null +++ b/subprojects/groovy-groovydoc/src/test/groovy/org/codehaus/groovy/tools/groovydoc/testfiles/groovy_10593/b/TestStaticStar.java @@ -0,0 +1,5 @@ +package org.codehaus.groovy.tools.groovydoc.testfiles.groovy_10593.b; + +import org.codehaus.groovy.tools.groovydoc.testfiles.groovy_10593.a.StaticList.*; + +public interface TestStaticStar extends List {} \ No newline at end of file
