--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java Wed Nov 29 15:01:16 2017 -0800
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/WorkArounds.java Wed Nov 29 15:27:47 2017 -0800
@@ -151,21 +151,6 @@
return (doclint == null);
}
- // TODO: jx.l.m directSuperTypes don't work for things like Enum,
- // so we use javac directly, investigate why jx.l.m is not cutting it.
- public List<TypeMirror> interfaceTypesOf(TypeMirror type) {
- com.sun.tools.javac.util.List<com.sun.tools.javac.code.Type> interfaces =
- ((DocEnvImpl)configuration.docEnv).toolEnv.getTypes().interfaces((com.sun.tools.javac.code.Type)type);
- if (interfaces.isEmpty()) {
- return Collections.emptyList();
- }
- List<TypeMirror> list = new ArrayList<>(interfaces.size());
- for (com.sun.tools.javac.code.Type t : interfaces) {
- list.add((TypeMirror)t);
- }
- return list;
- }
-
/*
* TODO: This method exists because of a bug in javac which does not
* handle "@deprecated tag in package-info.java", when this issue
--- a/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Wed Nov 29 15:01:16 2017 -0800
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/toolkit/util/Utils.java Wed Nov 29 15:27:47 2017 -0800
@@ -55,6 +55,8 @@
import javax.lang.model.type.NoType;
import javax.lang.model.type.PrimitiveType;
import javax.lang.model.type.TypeMirror;
+import javax.lang.model.type.TypeVariable;
+import javax.lang.model.type.WildcardType;
import javax.lang.model.util.ElementFilter;
import javax.lang.model.util.ElementKindVisitor9;
import javax.lang.model.util.Elements;
@@ -976,71 +978,40 @@
}
/**
- * For the class return all implemented interfaces including the
- * superinterfaces of the implementing interfaces, also iterate over for
- * all the superclasses. For interface return all the extended interfaces
- * as well as superinterfaces for those extended interfaces.
+ * Returns all the implemented super-interfaces of a given type,
+ * in the case of classes, include all the super-interfaces of
+ * the supertype. The super-interfaces are collected before the
+ * super-interfaces of the supertype.
*
- * @param te the class to get the interfaces for
- * @return List of all the required interfaces.
+ * @param te the type element to get the super-interfaces for.
+ * @return the list of super-interfaces.
*/
public Set<TypeMirror> getAllInterfaces(TypeElement te) {
Set<TypeMirror> results = new LinkedHashSet<>();
-
- List<? extends TypeMirror> interfaceTypes = te.getInterfaces();
-
- for (TypeMirror interfaceType : interfaceTypes) {
- TypeElement intfc = asTypeElement(interfaceType);
-
- if (isPublic(intfc) || isLinkable(intfc)) {
- results.add(interfaceType);
- TypeElement klass = asTypeElement(interfaceType);
- for (TypeMirror t : getAllInterfaces(klass)) {
- t = getDeclaredType(results, te, t);
- results.add(t);
- }
- }
- }
- // TypeMirror contains the modified TypeParameterElement's types represented
- // in the local Class'es elements types. ex: Foo<E> implements Bar<V> and the
- // class being considered is Foo then TypeParameters will be represented as <E>
- // note that any conversion might revert back to the old signature. For this
- // very reason we get the superType, and find its interfaces.
- TypeMirror superType = getSuperType(te);
- if (superType == getObjectType())
- return results;
- // Try walking the tree
- addAllInterfaceTypes(results, te, superType,
- configuration.workArounds.interfaceTypesOf(superType));
+ getAllInterfaces(te.asType(), results);
return results;
}
- private void findAllInterfaceTypes(Set<TypeMirror> results, final TypeElement baseClass,
- TypeMirror p) {
- TypeMirror superType = getSuperType(asTypeElement(p));
- if (superType == p) {
- return;
- }
- addAllInterfaceTypes(results, baseClass, superType,
- configuration.workArounds.interfaceTypesOf(superType));
- }
-
- private void addAllInterfaceTypes(Set<TypeMirror> results,
- final TypeElement baseClass, TypeMirror type,
- List<TypeMirror> interfaceTypes) {
- for (TypeMirror interfaceType : interfaceTypes) {
- TypeElement iElement = asTypeElement(interfaceType);
- if (isPublic(iElement) && isLinkable(iElement)) {
- interfaceType = getDeclaredType(results, baseClass, interfaceType);
- results.add(interfaceType);
- Set<TypeMirror> superInterfaces = getAllInterfaces(iElement);
- for (TypeMirror superInterface : superInterfaces) {
- superInterface = getDeclaredType(results, baseClass, superInterface);
- results.add(superInterface);
- }
+ private void getAllInterfaces(TypeMirror type, Set<TypeMirror> results) {
+ List<? extends TypeMirror> intfacs = typeUtils.directSupertypes(type);
+ TypeMirror superType = null;
+ for (TypeMirror intfac : intfacs) {
+ if (intfac == getObjectType())
+ continue;
+ TypeElement e = asTypeElement(intfac);
+ if (isInterface(e)) {
+ if (isPublic(e) || isLinkable(e))
+ results.add(intfac);
+
+ getAllInterfaces(intfac, results);
+ } else {
+ // Save the supertype for later.
+ superType = intfac;
}
}
- findAllInterfaceTypes(results, baseClass, type);
+ // Collect the super-interfaces of the supertype.
+ if (superType != null)
+ getAllInterfaces(superType, results);
}
/**
@@ -1154,22 +1125,6 @@
(isPublic(typeElem) || isProtected(typeElem)));
}
- List<TypeMirror> asErasureTypes(Collection<TypeElement> inList) {
- List<TypeMirror> out = new ArrayList<>(inList.size());
- inList.stream().forEach((te) -> {
- out.add(typeUtils.erasure(te.asType()));
- });
- return out;
- }
-
- List<TypeMirror> asTypes(Collection<TypeElement> inList) {
- List<TypeMirror> out = new ArrayList<>(inList.size());
- inList.stream().forEach((te) -> {
- out.add(te.asType());
- });
- return out;
- }
-
/**
* Return this type as a {@code TypeElement} if it represents a class
* interface or annotation. Array dimensions are ignored.
@@ -1195,10 +1150,9 @@
}
@Override
- public TypeElement visitTypeVariable(javax.lang.model.type.TypeVariable t, Void p) {
- /*
- * TODO: Check with JJG.
- * if we have an annotated type @A $B T, then erasure returns a
+ public TypeElement visitTypeVariable(TypeVariable t, Void p) {
+ /* TODO, this may not be an optimimal fix.
+ * if we have an annotated type @DA T, then erasure returns a
* none, in this case we use asElement instead.
*/
if (isAnnotated(t)) {
@@ -1208,7 +1162,7 @@
}
@Override
- public TypeElement visitWildcard(javax.lang.model.type.WildcardType t, Void p) {
+ public TypeElement visitWildcard(WildcardType t, Void p) {
return visit(typeUtils.erasure(t));
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/jdk/javadoc/doclet/testGrandParentTypes/TestGrandParentTypes.java Wed Nov 29 15:27:47 2017 -0800
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8182108
+ * @summary Verify that grand parent interface types are correct, and
+ * various interface related sections are correctly generated.
+ * @library ../lib
+ * @modules jdk.javadoc/jdk.javadoc.internal.tool
+ * @build JavadocTester
+ * @run main TestGrandParentTypes
+ */
+
+public class TestGrandParentTypes extends JavadocTester {
+
+ public static void main(String... args) throws Exception {
+ TestGrandParentTypes tester = new TestGrandParentTypes();
+ tester.runTests();
+ }
+
+ @Test
+ void test1() {
+ javadoc("-d", "out-1",
+ "-package",
+ "-sourcepath", testSrc,
+ "pkg1");
+
+ checkExit(Exit.OK);
+
+ checkOrder("pkg1/A.SupplierWithAList.html",
+ "All Superinterfaces:",
+ "A.AList",
+ "java.util.Collection<java.lang.Object>",
+ "java.lang.Iterable<java.lang.Object>",
+ "java.util.List<java.lang.Object>");
+
+ checkOrder("pkg1/A.AList.html",
+ "All Superinterfaces:",
+ "java.util.Collection<java.lang.Object>",
+ "java.lang.Iterable<java.lang.Object>",
+ "java.util.List<java.lang.Object>");
+
+ checkOrder("pkg1/TEnum.html",
+ "All Implemented Interfaces:",
+ "java.io.Serializable",
+ "java.lang.Comparable");
+
+ checkOrder("pkg1/TError.html",
+ "All Implemented Interfaces:",
+ "java.io.Serializable");
+
+ checkOrder("pkg1/TException.html",
+ "All Implemented Interfaces:",
+ "java.io.Serializable");
+
+ checkOrder("pkg1/MList.html",
+ "All Implemented Interfaces:",
+ "java.io.Serializable",
+ "java.lang.Cloneable",
+ "java.lang.Iterable<java.lang.String>",
+ "java.util.Collection<java.lang.String>",
+ "java.util.List<java.lang.String>",
+ "java.util.RandomAccess");
+ }
+}
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/langtools/jdk/javadoc/doclet/testGrandParentTypes/pkg1/A.java Wed Nov 29 15:27:47 2017 -0800
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package pkg1;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public interface A {
+ interface AList extends List<Object> { }
+ interface SupplierWithAList<T> extends AList {
+ T getThingy();
+ }
+}
+
+enum TEnum {}
+class TError extends Error {}
+class TException extends Exception {}
+class MList extends ArrayList<String> {}