You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/05/03 00:45:52 UTC
[groovy] 04/04: GROOVY-10593: add new test cases and bugfix for static imports
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
commit 937a5bf4a6fc5d7a21cc8f56a1daf534bf073f57
Author: Stephane Talbot <St...@univ-savoie.fr>
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