From 5248eb02153e49c04dbdd863db68b48732cb2879 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 6 Feb 2023 19:02:09 +0000 Subject: doclava17: Implement missing API from RootDocImpl Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I5f20517076aa369130f48911c7b0a4e8df94cddc --- .../com/google/doclava/javadoc/RootDocImpl.java | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/RootDocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/RootDocImpl.java index 9c8e8ff..c9a07c5 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/RootDocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/RootDocImpl.java @@ -88,21 +88,31 @@ public class RootDocImpl extends DocImpl implements RootDoc { } @Override - @Used + @Used(implemented = true) public ClassDoc[] classes() { - throw new UnsupportedOperationException("not yet implemented"); + return context.caches.classes.values().toArray(ClassDoc[]::new); } @Override - @Used + @Used(implemented = true) public ClassDoc classNamed(String qualifiedName) { - throw new UnsupportedOperationException("not yet implemented"); + for (ClassDoc cls : context.caches.classes.values()) { + if (cls.qualifiedName().equals(qualifiedName)) { + return cls; + } + } + return null; } @Override - @Used + @Used(implemented = true) public PackageDoc packageNamed(String name) { - throw new UnsupportedOperationException("not yet implemented"); + for (PackageDoc pkg : context.caches.packages.values()) { + if (pkg.name().equals(name)) { + return pkg; + } + } + return null; } @Override -- cgit v1.2.3 From bf9d98051ee68a6c58c24cd4698489cf4ed868cb Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 6 Feb 2023 19:02:27 +0000 Subject: doclava17: Implement TypeVariableImpl Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I977b155b2754b98c537f3cf650a5fcd618a941a1 --- .../java/com/google/doclava/javadoc/TypeVariableImpl.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java index f28bd53..43e8835 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java @@ -31,12 +31,14 @@ import com.sun.javadoc.AnnotationDesc; import com.sun.javadoc.ProgramElementDoc; import com.sun.javadoc.Type; import com.sun.javadoc.TypeVariable; -import javax.lang.model.type.TypeMirror; class TypeVariableImpl extends TypeImpl implements TypeVariable { - protected TypeVariableImpl(TypeMirror typeMirror, Context context) { - super(typeMirror, context); + private final javax.lang.model.type.TypeVariable typeVariable; + + protected TypeVariableImpl(javax.lang.model.type.TypeVariable typeVariable, Context context) { + super(typeVariable, context); + this.typeVariable = typeVariable; } static TypeVariableImpl create(javax.lang.model.type.TypeVariable typeVariable, @@ -46,9 +48,9 @@ class TypeVariableImpl extends TypeImpl implements TypeVariable { } @Override - @Used + @Used(implemented = true) public Type[] bounds() { - throw new UnsupportedOperationException("not yet implemented"); + return new Type[0]; } @Override -- cgit v1.2.3 From 7bd9710da7e7ac1fac0c4229e036dfd2f349a3ea Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 6 Feb 2023 19:02:41 +0000 Subject: doclava17: Implement WildcardTypeImpl Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: Ib8a0af4e7a0bed0f58fe91768c8d0ed3cb0da444 --- .../google/doclava/javadoc/WildcardTypeImpl.java | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java index 27ba1a1..fc02f91 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java @@ -28,12 +28,17 @@ package com.google.doclava.javadoc; import com.google.doclava.annotation.Used; import com.sun.javadoc.ClassDoc; import com.sun.javadoc.Type; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; import javax.lang.model.type.WildcardType; class WildcardTypeImpl extends TypeImpl implements com.sun.javadoc.WildcardType { + private final WildcardType wildcardType; + protected WildcardTypeImpl(WildcardType wildcardType, Context context) { super(wildcardType, context); + this.wildcardType = wildcardType; } static WildcardTypeImpl create(WildcardType wildcardType, Context context) { @@ -42,9 +47,14 @@ class WildcardTypeImpl extends TypeImpl implements com.sun.javadoc.WildcardType } @Override - @Used + @Used(implemented = true) public ClassDoc asClassDoc() { - throw new UnsupportedOperationException("not yet implemented"); + TypeMirror extend = wildcardType.getExtendsBound(); + if (extend == null) { + return null; + } + return ClassDocImpl.create( + (TypeElement) context.environment.getTypeUtils().asElement(extend), context); } @Override @@ -54,14 +64,16 @@ class WildcardTypeImpl extends TypeImpl implements com.sun.javadoc.WildcardType } @Override - @Used + @Used(implemented = true) public Type[] extendsBounds() { - throw new UnsupportedOperationException("not yet implemented"); + TypeMirror extendsBound = wildcardType.getExtendsBound(); + return new Type[]{TypeImpl.create(extendsBound, context)}; } @Override - @Used + @Used(implemented = true) public Type[] superBounds() { - throw new UnsupportedOperationException("not yet implemented"); + TypeMirror superBounds = wildcardType.getSuperBound(); + return new Type[]{TypeImpl.create(superBounds, context)}; } } -- cgit v1.2.3 From dcbdd36af54bcd2f3cba6284e5c4efa35c94a268 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Tue, 17 Jan 2023 15:06:51 +0000 Subject: doclava17: Fix ClassDocImpl interfaces and tags Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I94c415b3ba39b9f8849035acc4152fb8371034e2 --- .../com/google/doclava/javadoc/ClassDocImpl.java | 23 +++++++++++----------- .../java/com/google/doclava/javadoc/DocImpl.java | 12 +++++++---- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java index ed11f35..bd50691 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java @@ -54,6 +54,7 @@ class ClassDocImpl extends ProgramElementDocImpl implements ClassDo private ConstructorDoc[] constructorsFiltered; private ConstructorDoc[] constructorsAll; private Type[] interfaceTypes; + private ClassDoc[] interfaces; private TypeVariable[] typeParameters; private MethodDoc[] methodsFiltered; private MethodDoc[] methodsAll; @@ -283,26 +284,26 @@ class ClassDocImpl extends ProgramElementDocImpl implements ClassDo return context.environment.getTypeUtils().isSubtype(typeElement.asType(), other.asType()); } - @Override - @Unused - public ClassDoc[] interfaces() { - throw new UnsupportedOperationException("not yet implemented"); - } - @Override @Used(implemented = true) - public Type[] interfaceTypes() { - if (interfaceTypes == null) { - interfaceTypes = typeElement.getInterfaces() + public ClassDoc[] interfaces() { + if (interfaces == null) { + interfaces = typeElement.getInterfaces() .stream() .map(typeMirror -> { TypeElement asElement = (TypeElement) context.environment.getTypeUtils() .asElement(typeMirror); return ClassDocImpl.create(asElement, context); }) - .toArray(Type[]::new); + .toArray(ClassDoc[]::new); } - return interfaceTypes; + return interfaces; + } + + @Override + @Used(implemented = true) + public Type[] interfaceTypes() { + return interfaces(); } @Override diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java index edc3f4d..15e3a62 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java @@ -109,10 +109,14 @@ abstract class DocImpl implements Doc, Comparable { public Tag[] inlineTags() { if (inlineTags == null) { var dt = context.environment.getDocTrees().getDocCommentTree(element); - List tags = new ArrayList<>(dt.getFullBody()); - inlineTags = tags.stream() - .map(tag -> TagImpl.create(tag, element, context)) - .toArray(Tag[]::new); + if (dt == null) { + inlineTags = new Tag[0]; + } else { + List tags = new ArrayList<>(dt.getFullBody()); + inlineTags = tags.stream() + .map(tag -> TagImpl.create(tag, element, context)) + .toArray(Tag[]::new); + } } return inlineTags; } -- cgit v1.2.3 From d9620d4675f8666c37fac60d105590ce48e19b9b Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Tue, 17 Jan 2023 15:14:52 +0000 Subject: doclava17: Provide stubs for source position Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I8f87821809b7862c776677350c57b5cd63cf6eef --- .../main/java/com/google/doclava/javadoc/ClassDocImpl.java | 14 ++++++++++++-- .../src/main/java/com/google/doclava/javadoc/DocImpl.java | 8 ++++++-- .../com/google/doclava/javadoc/SourcePositionImpl.java | 8 +++++++- .../src/main/java/com/google/doclava/javadoc/TypeImpl.java | 6 ++---- .../java/com/google/doclava/javadoc/WildcardTypeImpl.java | 6 ++++++ 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java index bd50691..f45ebc4 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java @@ -44,6 +44,8 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.NestingKind; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; import javax.lang.model.util.ElementFilter; class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { @@ -249,7 +251,11 @@ class ClassDocImpl extends ProgramElementDocImpl implements ClassDo if (isInterface()) { return null; } - Type t = TypeImpl.create(typeElement.getSuperclass(), context); + TypeMirror superclassMirror = typeElement.getSuperclass(); + if (superclassMirror.getKind() == TypeKind.NONE) { + return null; + } + Type t = TypeImpl.create(superclassMirror, context); if (t instanceof ClassDoc cls) { return cls; } else { @@ -263,7 +269,11 @@ class ClassDocImpl extends ProgramElementDocImpl implements ClassDo if (isInterface()) { return null; } - Type t = TypeImpl.create(typeElement.getSuperclass(), context); + TypeMirror superclassMirror = typeElement.getSuperclass(); + if (superclassMirror.getKind() == TypeKind.NONE) { + return null; + } + Type t = TypeImpl.create(superclassMirror, context); if (t instanceof ClassDoc cls) { return cls; } else if (t instanceof ParameterizedType pt) { diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java index 15e3a62..d6f048f 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java @@ -149,8 +149,12 @@ abstract class DocImpl implements Doc, Comparable { public String getRawCommentText() { if (getRawCommentText == null) { var dt = context.environment.getDocTrees().getDocCommentTree(element); - //TODO: this implementation is slightly different, consider reimplementing. - getRawCommentText = dt.toString(); + if (dt == null) { + getRawCommentText = ""; + } else { + //TODO: this implementation is slightly different, consider reimplementing. + getRawCommentText = dt.toString(); + } } return getRawCommentText; } diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/SourcePositionImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/SourcePositionImpl.java index 18a7c3a..7813498 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/SourcePositionImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/SourcePositionImpl.java @@ -33,10 +33,16 @@ class SourcePositionImpl implements SourcePosition { public static final SourcePositionImpl STUB = new SourcePositionImpl(); + private final File file; + + public SourcePositionImpl() { + this.file = new File("."); + } + @Override @Used(implemented = true) public File file() { - return null; + return file; } @Override diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java index 8771e52..480f1b7 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java @@ -125,10 +125,8 @@ abstract class TypeImpl implements Type { @Override @Used(implemented = true) public String simpleTypeName() { - return context.environment.getTypeUtils() - .asElement(typeMirror) - .getSimpleName() - .toString(); + var qualifiedTypeName = QUALIFIED_NAME_VISITOR.visit(typeMirror, context); + return qualifiedTypeName.substring(qualifiedTypeName.lastIndexOf('.') + 1); } @Override diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java index fc02f91..7ae64cf 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java @@ -67,6 +67,9 @@ class WildcardTypeImpl extends TypeImpl implements com.sun.javadoc.WildcardType @Used(implemented = true) public Type[] extendsBounds() { TypeMirror extendsBound = wildcardType.getExtendsBound(); + if (extendsBound == null) { + return new Type[0]; + } return new Type[]{TypeImpl.create(extendsBound, context)}; } @@ -74,6 +77,9 @@ class WildcardTypeImpl extends TypeImpl implements com.sun.javadoc.WildcardType @Used(implemented = true) public Type[] superBounds() { TypeMirror superBounds = wildcardType.getSuperBound(); + if (superBounds == null) { + return new Type[0]; + } return new Type[]{TypeImpl.create(superBounds, context)}; } } -- cgit v1.2.3 From d09e3b008f322ebe775ba0a55cea29e5b48e56f8 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Tue, 17 Jan 2023 15:56:20 +0000 Subject: doclava17: Provide stubs for AnnotationValueImpl Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I20684119717184e8af40e597ab1a366e2c728d69 --- .../main/java/com/google/doclava/javadoc/AnnotationValueImpl.java | 4 ++-- .../java/com/google/doclava/javadoc/ExecutableMemberDocImpl.java | 8 ++++---- doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java | 5 +++-- .../main/java/com/google/doclava/javadoc/WildcardTypeImpl.java | 8 ++++++-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/AnnotationValueImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/AnnotationValueImpl.java index 4eca796..0c1fe13 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/AnnotationValueImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/AnnotationValueImpl.java @@ -128,12 +128,12 @@ class AnnotationValueImpl implements AnnotationValue { @Override public Object visitEnumConstant(VariableElement c, Context context) { - throw new UnsupportedOperationException("not yet implemented"); + return null; } @Override public Object visitAnnotation(AnnotationMirror m, Context ctx) { - throw new UnsupportedOperationException("not yet implemented"); + return null; } @Override diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/ExecutableMemberDocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/ExecutableMemberDocImpl.java index e835200..933889d 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/ExecutableMemberDocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/ExecutableMemberDocImpl.java @@ -36,6 +36,7 @@ import com.sun.javadoc.ThrowsTag; import com.sun.javadoc.Type; import com.sun.javadoc.TypeVariable; import java.lang.reflect.Modifier; +import java.util.Objects; import java.util.stream.Collectors; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; @@ -123,12 +124,11 @@ abstract class ExecutableMemberDocImpl extends MemberDocImpl case ANNOTATION_TYPE -> AnnotationTypeDocImpl.create( (TypeElement) element, context); - default -> throw new UnsupportedOperationException( - "Expected CLASS, INTERFACE, ANNOTATION_TYPE or ENUM, but got " - + element.getKind()); + default -> null; }; }) - .toArray(ClassDocImpl[]::new); + .filter(Objects::nonNull) + .toArray(ClassDoc[]::new); } return thrownExceptions; } diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java index 480f1b7..ceb63bf 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java @@ -67,8 +67,9 @@ abstract class TypeImpl implements Type { // void is also a "primitive type" case VOID -> PrimitiveTypeImpl.VOID; // arrays - case ARRAY -> throw new UnsupportedOperationException( - "ARRAY type is not yet implemented"); + case ARRAY -> { + yield ArrayTypeImpl.create((ArrayType) m, context); + } // complex types case WILDCARD -> { var wildcardType = (javax.lang.model.type.WildcardType) m; diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java index 7ae64cf..774ff78 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java @@ -53,8 +53,12 @@ class WildcardTypeImpl extends TypeImpl implements com.sun.javadoc.WildcardType if (extend == null) { return null; } - return ClassDocImpl.create( - (TypeElement) context.environment.getTypeUtils().asElement(extend), context); + try { + return ClassDocImpl.create( + (TypeElement) context.environment.getTypeUtils().asElement(extend), context); + } catch (Exception e) { + return null; + } } @Override -- cgit v1.2.3 From 6c80f7836ebc2d639a66e84620612f1744c57e1c Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 30 Jan 2023 14:38:24 +0000 Subject: doclava17: Stub for wildcard Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I61204589fe64ec26636968c236a03432d8ca2227 --- .../main/java/com/google/doclava/javadoc/TypeImpl.java | 7 +++++++ .../com/google/doclava/javadoc/TypeVariableImpl.java | 12 ++++++++++++ .../com/google/doclava/javadoc/WildcardTypeImpl.java | 18 +++++++----------- src/com/google/doclava/MethodInfo.java | 1 - 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java index ceb63bf..f4416ee 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java @@ -221,6 +221,13 @@ abstract class TypeImpl implements Type { return this.visit(t.getComponentType(), context); } + @Override + public String visitWildcard(javax.lang.model.type.WildcardType t, Context context) { + //TODO: hack + return "?"; + //return super.visitWildcard(t, context); + } + @Override protected String defaultAction(TypeMirror e, Context context) { throw new UnsupportedOperationException( diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java index 43e8835..e83b0ae 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java @@ -28,9 +28,12 @@ package com.google.doclava.javadoc; import com.google.doclava.annotation.Unused; import com.google.doclava.annotation.Used; import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.ClassDoc; import com.sun.javadoc.ProgramElementDoc; import com.sun.javadoc.Type; import com.sun.javadoc.TypeVariable; +import java.util.Objects; +import javax.lang.model.type.TypeMirror; class TypeVariableImpl extends TypeImpl implements TypeVariable { @@ -53,6 +56,15 @@ class TypeVariableImpl extends TypeImpl implements TypeVariable { return new Type[0]; } + @Override + @Used(implemented = true) + public ClassDoc asClassDoc() { + TypeMirror erasure = context.environment.getTypeUtils().erasure(typeVariable); + Type type = create(erasure, context); + Objects.requireNonNull(type); + return type.asClassDoc(); + } + @Override @Unused public ProgramElementDoc owner() { diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java index 774ff78..077a70e 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/WildcardTypeImpl.java @@ -28,7 +28,7 @@ package com.google.doclava.javadoc; import com.google.doclava.annotation.Used; import com.sun.javadoc.ClassDoc; import com.sun.javadoc.Type; -import javax.lang.model.element.TypeElement; +import java.util.Objects; import javax.lang.model.type.TypeMirror; import javax.lang.model.type.WildcardType; @@ -49,16 +49,10 @@ class WildcardTypeImpl extends TypeImpl implements com.sun.javadoc.WildcardType @Override @Used(implemented = true) public ClassDoc asClassDoc() { - TypeMirror extend = wildcardType.getExtendsBound(); - if (extend == null) { - return null; - } - try { - return ClassDocImpl.create( - (TypeElement) context.environment.getTypeUtils().asElement(extend), context); - } catch (Exception e) { - return null; - } + TypeMirror erasure = context.environment.getTypeUtils().erasure(wildcardType); + Type type = create(erasure, context); + Objects.requireNonNull(type); + return type.asClassDoc(); } @Override @@ -86,4 +80,6 @@ class WildcardTypeImpl extends TypeImpl implements com.sun.javadoc.WildcardType } return new Type[]{TypeImpl.create(superBounds, context)}; } + + } diff --git a/src/com/google/doclava/MethodInfo.java b/src/com/google/doclava/MethodInfo.java index f3ac64f..3a8b1a8 100644 --- a/src/com/google/doclava/MethodInfo.java +++ b/src/com/google/doclava/MethodInfo.java @@ -19,7 +19,6 @@ package com.google.doclava; import com.google.clearsilver.jsilver.data.Data; import com.google.doclava.apicheck.AbstractMethodInfo; import com.google.doclava.apicheck.ApiInfo; - import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -- cgit v1.2.3 From d1165b6b6d78f197feb6745d6b1ae9b7b5299f55 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 30 Jan 2023 17:14:33 +0000 Subject: doclava17: Fix TypeInfo Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I11f4e97b25da65b63cb78683f87653096b8b209e --- .../com/google/doclava/javadoc/ParameterImpl.java | 12 +++++++++- .../java/com/google/doclava/javadoc/TypeImpl.java | 14 ++++------- .../google/doclava/javadoc/TypeVariableImpl.java | 8 +++++++ .../google/doclava/javadoc/ClassDocImplTest.java | 2 ++ src/com/google/doclava/TypeInfo.java | 27 +++++++++++++++++++--- 5 files changed, 49 insertions(+), 14 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/ParameterImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/ParameterImpl.java index 975291a..94da81a 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/ParameterImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/ParameterImpl.java @@ -29,6 +29,7 @@ import com.google.doclava.annotation.Used; import com.sun.javadoc.AnnotationDesc; import com.sun.javadoc.Parameter; import com.sun.javadoc.Type; +import com.sun.javadoc.TypeVariable; import javax.lang.model.element.VariableElement; class ParameterImpl implements Parameter { @@ -65,7 +66,16 @@ class ParameterImpl implements Parameter { @Override @Used(implemented = true) public String typeName() { - return type.qualifiedTypeName() + type.dimension(); + String result; + if (type instanceof ClassDocImpl || type instanceof TypeVariable) { + result = type.typeName() + type.dimension(); + } else { + result = type.qualifiedTypeName() + type.dimension(); + } + if (result.contains("<")) { + throw new RuntimeException("qwe"); + } + return result; } @Override diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java index f4416ee..e933b31 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java @@ -34,7 +34,6 @@ import com.sun.javadoc.ParameterizedType; import com.sun.javadoc.Type; import com.sun.javadoc.TypeVariable; import com.sun.javadoc.WildcardType; -import java.util.stream.Collectors; import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; import javax.lang.model.type.ArrayType; @@ -204,16 +203,11 @@ abstract class TypeImpl implements Type { public String visitDeclared(DeclaredType t, Context context) { final String typeName = t.asElement().toString(); - final String typeArguments = t.getTypeArguments() - .stream() - .map(tm -> this.visit(tm, context)) - .collect(Collectors.joining(", ")); - - if (typeArguments.isEmpty()) { - return typeName; - } else { - return "%s<%s>".formatted(typeName, typeArguments); + if (typeName.contains("<")) { + throw new RuntimeException(); } + + return typeName; } @Override diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java index e83b0ae..ccc8aab 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/TypeVariableImpl.java @@ -82,4 +82,12 @@ class TypeVariableImpl extends TypeImpl implements TypeVariable { public AnnotationDesc[] annotations() { throw new UnsupportedOperationException("not yet implemented"); } + + @Override + @Used(implemented = true) + public String typeName() { + TypeMirror erasure = context.environment.getTypeUtils().erasure(typeVariable); + Type type = create(erasure, context); + return type.typeName(); + } } diff --git a/doclava17/src/test/java/com/google/doclava/javadoc/ClassDocImplTest.java b/doclava17/src/test/java/com/google/doclava/javadoc/ClassDocImplTest.java index c9f10b3..ef17e5c 100644 --- a/doclava17/src/test/java/com/google/doclava/javadoc/ClassDocImplTest.java +++ b/doclava17/src/test/java/com/google/doclava/javadoc/ClassDocImplTest.java @@ -686,6 +686,8 @@ public class ClassDocImplTest extends BaseTest { publicClassWithNests$Nest1.qualifiedName()); assertEquals("com.example.classes.PublicClassWithNests.Nest1.Nest2", publicClassWithNests$Nest1$Nest2.qualifiedName()); + + assertEquals("java.util.Map", javaUtilMap.qualifiedTypeName()); } @Test diff --git a/src/com/google/doclava/TypeInfo.java b/src/com/google/doclava/TypeInfo.java index da5bc1f..b4dd9a5 100644 --- a/src/com/google/doclava/TypeInfo.java +++ b/src/com/google/doclava/TypeInfo.java @@ -17,8 +17,13 @@ package com.google.doclava; import com.google.clearsilver.jsilver.data.Data; - -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; public class TypeInfo implements Resolvable { public static final Set PRIMITIVE_TYPES = Collections.unmodifiableSet( @@ -31,6 +36,9 @@ public class TypeInfo implements Resolvable { mDimension = dimension; mSimpleTypeName = simpleTypeName; mQualifiedTypeName = qualifiedTypeName; + if (mQualifiedTypeName == null) { + int x = 5; + } mClass = cl; } @@ -121,6 +129,9 @@ public class TypeInfo implements Resolvable { mQualifiedTypeName = typeString; } else { mQualifiedTypeName = typeString; + if (mQualifiedTypeName == null) { + int x = 5; + } pos = typeString.lastIndexOf('.'); if (pos > -1) { mSimpleTypeName = typeString.substring(pos + 1); @@ -140,6 +151,9 @@ public class TypeInfo implements Resolvable { mDimension = other.dimension(); mSimpleTypeName = other.simpleTypeName(); mQualifiedTypeName = other.qualifiedTypeName(); + if (mQualifiedTypeName == null) { + int x = 5; + } mClass = other.asClassInfo(); if (other.typeArguments() != null) { mTypeArguments = new ArrayList(other.typeArguments()); @@ -162,6 +176,10 @@ public class TypeInfo implements Resolvable { mResolvedClass = true; if (mClass == null && !mIsPrimitive && !mIsTypeVariable && !mIsWildcard) { mClass = Converter.obtainClass(qualifiedTypeName()); + if (mClass == null) { + int x = 5; + mClass = Converter.obtainClass(qualifiedTypeName()); + } } } return mClass; @@ -502,7 +520,10 @@ public class TypeInfo implements Resolvable { mResolutions.add(resolution); allResolved = false; } else { - mClass = InfoBuilder.Caches.obtainClass(qualifiedClassName.toString()); + mClass = InfoBuilder.Caches.obtainClass(qualifiedClassName.toString()); + if (mClass == null) { + int x = 5; + } } } else if ("variability".equals(resolution.getVariable())) { StringBuilder qualifiedClassName = new StringBuilder(); -- cgit v1.2.3 From abfea825b347359aae16aabe446e4e00c85bec0b Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 6 Feb 2023 15:47:37 +0000 Subject: doclava17: Add types to AnnotationValueImpl Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I4924377a37ce2133b5dd84a31d84c722beddbb78 --- .../src/main/java/com/google/doclava/javadoc/AnnotationValueImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/AnnotationValueImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/AnnotationValueImpl.java index 0c1fe13..e3ea5d0 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/AnnotationValueImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/AnnotationValueImpl.java @@ -120,7 +120,8 @@ class AnnotationValueImpl implements AnnotationValue { public Object visitType(TypeMirror m, Context ctx) { var e = ctx.environment.getTypeUtils().asElement(m); return switch (e.getKind()) { - case CLASS -> ClassDocImpl.create((TypeElement) e, ctx); + case CLASS, INTERFACE, ENUM -> ClassDocImpl.create((TypeElement) e, ctx); + case ANNOTATION_TYPE -> AnnotationTypeDocImpl.create((TypeElement) e, ctx); default -> throw new UnsupportedOperationException( e.getKind() + " is not not yet implemented"); }; -- cgit v1.2.3 From d63bc8518bf8a37efa0db951d808515b74c8e72c Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 6 Feb 2023 15:47:39 +0000 Subject: doclava17: Implement find class Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: Ia90c9d0fef23e075cbeb7bcf24ac6c9237240fef --- .../com/google/doclava/javadoc/ClassDocImpl.java | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java index f45ebc4..406a1cf 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java @@ -25,6 +25,7 @@ package com.google.doclava.javadoc; +import com.google.doclava.Converter; import com.google.doclava.annotation.Unused; import com.google.doclava.annotation.Used; import com.sun.javadoc.AnnotatedType; @@ -486,13 +487,57 @@ class ClassDocImpl extends ProgramElementDocImpl implements ClassDo .toArray(ClassDoc[]::new); } + /** + * Note that this implementation does not search in sources! + * + *

+ * + * {@inheritDoc} + * + * @implNote Does not search in sources. + */ @Override @Used(implemented = true) public ClassDoc findClass(String className) { + ClassDoc result = searchClass(className); + if (result != null) { + return result; + } + + ClassDoc enclosing = containingClass(); + while (enclosing != null && enclosing.containingClass() != null) { + enclosing = enclosing.containingClass(); + } + if (enclosing == null) { + return null; + } + return ((ClassDocImpl) enclosing).searchClass(className); + } + + private ClassDoc searchClass(String className) { TypeElement cls = context.environment.getElementUtils().getTypeElement(className); if (cls != null) { return ClassDocImpl.create(cls, context); } + + for (ClassDoc nested : innerClasses()) { + if (nested.name().equals(className) || nested.name().endsWith("." + className)) { + return nested; + } else { + ClassDoc inNested = ((ClassDocImpl) nested).searchClass(className); + if (inNested != null) { + return inNested; + } + } + } + + ClassDoc inPackage = containingPackage().findClass(className); + if (inPackage != null) { + return inPackage; + } + + // + return null; } -- cgit v1.2.3 From e4fd4f417ecd32dd1f2d4800426ac45c27b23308 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 6 Feb 2023 15:47:37 +0000 Subject: doclava17: Stub source position Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I33e1c3abfe3e77606e82802f4fe807cee203bb9c --- doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java index d6f048f..0ad7c6f 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/DocImpl.java @@ -259,6 +259,6 @@ abstract class DocImpl implements Doc, Comparable { @Override @Used(implemented = true) public SourcePosition position() { - return null; + return SourcePositionImpl.STUB; } } -- cgit v1.2.3 From 7c51584c9f189068d9248f7272eae67cbd8f2587 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 6 Feb 2023 15:47:38 +0000 Subject: doclava17: Implement package class listing Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I96f0dff8081227392f036c6226293271a34feda3 --- .../com/google/doclava/javadoc/PackageDocImpl.java | 59 +++++++++++++++++----- .../google/doclava/javadoc/PackageDocImplTest.java | 2 +- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/PackageDocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/PackageDocImpl.java index b7c6e59..b053bab 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/PackageDocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/PackageDocImpl.java @@ -25,6 +25,7 @@ package com.google.doclava.javadoc; +import com.google.doclava.Converter; import com.google.doclava.annotation.Unused; import com.google.doclava.annotation.Used; import com.sun.javadoc.AnnotationDesc; @@ -34,6 +35,7 @@ import com.sun.javadoc.PackageDoc; import java.util.ArrayDeque; import java.util.Deque; import java.util.Iterator; +import java.util.List; import java.util.Spliterator; import java.util.Spliterators; import java.util.function.Predicate; @@ -48,6 +50,10 @@ class PackageDocImpl extends DocImpl implements PackageDoc { private final PackageElement packageElement; + + private String qualifiedName; + private ClassDoc[] allClasses; + private ClassDoc[] allClassesFiltered; private ClassDoc[] ordinaryClasses; private ClassDoc[] exceptions; private ClassDoc[] errors; @@ -61,17 +67,43 @@ class PackageDocImpl extends DocImpl implements PackageDoc { } static PackageDocImpl create(PackageElement e, Context context) { - return context.caches.packages.computeIfAbsent(e, el -> new PackageDocImpl(el, context)); + var ret = context.caches.packages.computeIfAbsent(e, el -> new PackageDocImpl(el, context)); + return ret; } @Override - @Unused + @Used(implemented = true) public ClassDoc[] allClasses(boolean filter) { - throw new UnsupportedOperationException("not yet implemented"); + if (!filter && allClasses != null) { + return allClasses; + } + if (filter && allClassesFiltered != null) { + return allClassesFiltered; + } + + List classes = + filterEnclosedElements(e -> e.getKind() == ElementKind.CLASS || + e.getKind() == ElementKind.INTERFACE || + e.getKind() == ElementKind.ENUM || + e.getKind() == ElementKind.ANNOTATION_TYPE) + .filter(e -> !filter || context.environment.isSelected(e)) + .map(e -> { + if (e.getKind() == ElementKind.ANNOTATION_TYPE) { + return AnnotationTypeDocImpl.create((TypeElement) e, context); + } + return ClassDocImpl.create((TypeElement) e, context); + }) + .toList(); + + if (filter) { + return allClassesFiltered = classes.toArray(ClassDoc[]::new); + } else { + return allClasses = classes.toArray(ClassDoc[]::new); + } } @Override - @Unused + @Used(implemented = true) public ClassDoc[] allClasses() { return allClasses(true); } @@ -80,6 +112,7 @@ class PackageDocImpl extends DocImpl implements PackageDoc { EnclosedElementsIterator it = new EnclosedElementsIterator(packageElement); return StreamSupport .stream(Spliterators.spliteratorUnknownSize(it, Spliterator.ORDERED), false) + .filter(context.environment::isIncluded) .filter(predicate); } @@ -160,9 +193,14 @@ class PackageDocImpl extends DocImpl implements PackageDoc { } @Override - @Unused + @Used(implemented = true) public ClassDoc findClass(String className) { - throw new UnsupportedOperationException("not yet implemented"); + for (ClassDoc c : allClasses()) { + if (c.name().equals(className)) { + return c; + } + } + return null; } @Override @@ -171,19 +209,12 @@ class PackageDocImpl extends DocImpl implements PackageDoc { return context.environment.isIncluded(packageElement); } - private String name; - @Override @Used(implemented = true) public String name() { - if (name == null) { - name = packageElement.getSimpleName().toString(); - } - return name; + return qualifiedName(); } - private String qualifiedName; - @Override public String qualifiedName() { if (qualifiedName == null) { diff --git a/doclava17/src/test/java/com/google/doclava/javadoc/PackageDocImplTest.java b/doclava17/src/test/java/com/google/doclava/javadoc/PackageDocImplTest.java index ab02ec7..d056d14 100644 --- a/doclava17/src/test/java/com/google/doclava/javadoc/PackageDocImplTest.java +++ b/doclava17/src/test/java/com/google/doclava/javadoc/PackageDocImplTest.java @@ -124,7 +124,7 @@ public class PackageDocImplTest extends BaseTest { @Test public void name() { - assertEquals("packages", comExamplePackages.name()); + assertEquals("com.example.packages", comExamplePackages.name()); } @Test -- cgit v1.2.3 From b586823d335da9abf6d144e27203bf4fcbacbd12 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 6 Feb 2023 15:47:41 +0000 Subject: doclava17: Implement ParameterizedTypeImpl.asClassDoc Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I73b512b95b1898b9c15db95835ec1f6f5b43485f --- .../com/google/doclava/javadoc/ParameterizedTypeImpl.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/ParameterizedTypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/ParameterizedTypeImpl.java index 9b49c01..5374947 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/ParameterizedTypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/ParameterizedTypeImpl.java @@ -27,9 +27,12 @@ package com.google.doclava.javadoc; import com.google.doclava.annotation.Unused; import com.google.doclava.annotation.Used; +import com.sun.javadoc.ClassDoc; import com.sun.javadoc.ParameterizedType; import com.sun.javadoc.Type; +import java.util.Objects; import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.TypeMirror; class ParameterizedTypeImpl extends TypeImpl implements ParameterizedType { @@ -83,4 +86,12 @@ class ParameterizedTypeImpl extends TypeImpl implements ParameterizedType { public Type containingType() { throw new UnsupportedOperationException("not yet implemented"); } + + @Override + public ClassDoc asClassDoc() { + TypeMirror erasure = context.environment.getTypeUtils().erasure(declaredType); + Type type = create(erasure, context); + Objects.requireNonNull(type); + return type.asClassDoc(); + } } -- cgit v1.2.3 From 56a15bf7e5ba216f61138cf39d8a0288b61557f4 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Mon, 6 Feb 2023 15:47:37 +0000 Subject: doclava17: Initialize nested classes Bug: 260694901 Test: ./gradlew e2eTestAOSP Test: ./gradlew doclava17:test Change-Id: I8ba82aecf5ea4c84c2cc3f0970b498a3a46167ee --- .../com/google/doclava/javadoc/RootDocImpl.java | 42 ++++++++++++++++------ 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/RootDocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/RootDocImpl.java index c9a07c5..d6e412e 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/RootDocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/RootDocImpl.java @@ -31,22 +31,29 @@ import com.sun.javadoc.ClassDoc; import com.sun.javadoc.PackageDoc; import com.sun.javadoc.RootDoc; import com.sun.javadoc.SourcePosition; +import java.util.ArrayList; +import java.util.List; import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.NestingKind; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; +import javax.lang.model.util.ElementFilter; import jdk.javadoc.doclet.DocletEnvironment; /** - * The {@code RootDocImpl} is an implementation of the "old" Doclet APIs (previously under {@code - * com.sun.javadoc.*}, deprecated since 9 and removed in 13) in terms of new Doclet APIs {@link - * jdk.javadoc.doclet.Doclet}. ({@link DocletEnvironment}). + * The {@code RootDocImpl} is an implementation of the "old" Doclet APIs (previously under + * {@code com.sun.javadoc.*}, deprecated since 9 and removed in 13) in terms of new Doclet APIs + * {@link jdk.javadoc.doclet.Doclet}. ({@link DocletEnvironment}). */ public class RootDocImpl extends DocImpl implements RootDoc { + private ClassDoc[] classes; + public RootDocImpl(DocletEnvironment environment) { super(null, new Context(environment)); - for (var e : context.environment.getIncludedElements()) { + for (var e : environment.getSpecifiedElements()) { switch (e.getKind()) { case CLASS, INTERFACE, ENUM, ANNOTATION_TYPE -> addClass((TypeElement) e); case PACKAGE -> PackageDocImpl.create((PackageElement) e, context); @@ -67,6 +74,18 @@ public class RootDocImpl extends DocImpl implements RootDoc { default -> throw new UnsupportedOperationException( "Unexpected element kind:" + c.getKind()); } + // Initialize nested + // TODO: Need to ensure this is needed! + ElementFilter.typesIn(c.getEnclosedElements()) + .stream() + .filter(te -> te.getNestingKind() == NestingKind.MEMBER) + .forEach(te -> { + if (te.getKind() == ElementKind.ANNOTATION_TYPE) { + AnnotationTypeDocImpl.create(te, context); + } else { + ClassDocImpl.create(te, context); + } + }); } @Override @@ -90,18 +109,19 @@ public class RootDocImpl extends DocImpl implements RootDoc { @Override @Used(implemented = true) public ClassDoc[] classes() { - return context.caches.classes.values().toArray(ClassDoc[]::new); + if (classes == null) { + List classesAndAnnotations = new ArrayList<>(context.caches.classes.values()); + classesAndAnnotations.addAll(context.caches.annotations.values()); + classes = classesAndAnnotations.toArray(ClassDoc[]::new); + } + return classes; } @Override @Used(implemented = true) public ClassDoc classNamed(String qualifiedName) { - for (ClassDoc cls : context.caches.classes.values()) { - if (cls.qualifiedName().equals(qualifiedName)) { - return cls; - } - } - return null; + TypeElement cls = context.environment.getElementUtils().getTypeElement(qualifiedName); + return cls == null ? null : ClassDocImpl.create(cls, context); } @Override -- cgit v1.2.3 From da833a15a2192cfd8dd9c6fb0daecaeb4c32b050 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Tue, 7 Feb 2023 17:33:19 +0000 Subject: Build old and new doclava with soong Bug: 260694901 Test: m doclava doclava-no-guava Test: m doclava17 doclava17-no-guava Change-Id: Iee1253876dd6a519430e9682f9799d0ac6cbde62 --- Android.bp | 84 ++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/Android.bp b/Android.bp index 3661470..24e6bb6 100644 --- a/Android.bp +++ b/Android.bp @@ -53,6 +53,39 @@ droiddoc_exported_dir { path: "res/assets/templates-sdk", } +filegroup { + name: "doclava_sources_jdk8", + srcs: ["src/com/google/doclava/**/*.java"], +} + +filegroup { + name: "doclava_sources_jdk17", + srcs: [ + "src/com/google/doclava/**/*.java", + "doclava17/src/main/java/**/*.java", + ], + exclude_srcs: [ + "src/com/google/doclava/Doclava.java", + ], +} + +java_defaults { + name: "doclava_defaults", + java_resource_dirs: ["res"], + errorprone: { + javacflags: [ + "-Xep:FormatString:WARN", + "-Xep:ComparableType:WARN", + "-Xep:ReturnValueIgnored:WARN", + ], + }, + static_libs: [ + "jsilver", + "antlr-runtime", + "tagsoup", + ], +} + // Stub doclet to be used with JDK 17 until b/240421555 is fixed java_library_host { name: "stubdoclet", @@ -68,51 +101,44 @@ java_library_host { java_library_host { name: "doclava", + defaults: ["doclava_defaults"], + srcs: [":doclava_sources_jdk8"], java_version: "1.8", - srcs: [ - "src/com/google/doclava/**/*.java", - ], static_libs: [ - "jsilver", "guava", - "antlr-runtime", - "tagsoup", ], use_tools_jar: true, - java_resource_dirs: ["res"], - errorprone: { - javacflags: [ - "-Xep:FormatString:WARN", - "-Xep:ComparableType:WARN", - "-Xep:ReturnValueIgnored:WARN", - ], - }, } java_library_host { name: "doclava-no-guava", + defaults: ["doclava_defaults"], + srcs: [":doclava_sources_jdk8"], java_version: "1.8", - srcs: [ - "src/com/google/doclava/**/*.java", - ], libs: [ "guava", ], + use_tools_jar: true, +} + +java_library_host { + name: "doclava17", + defaults: ["doclava_defaults"], + srcs: [":doclava_sources_jdk17"], + java_version: "17", static_libs: [ - "jsilver", - "antlr-runtime", - "tagsoup", + "guava", ], - use_tools_jar: true, - java_resource_dirs: ["res"], +} - errorprone: { - javacflags: [ - "-Xep:FormatString:WARN", - "-Xep:ComparableType:WARN", - "-Xep:ReturnValueIgnored:WARN", - ], - }, +java_library_host { + name: "doclava17-no-guava", + defaults: ["doclava_defaults"], + srcs: [":doclava_sources_jdk17"], + java_version: "17", + libs: [ + "guava", + ], } -- cgit v1.2.3 From 266d569879cb677f55657009209f25f7c489d28d Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Wed, 8 Feb 2023 00:31:24 +0000 Subject: Enable java17 Test: m doclava Change-Id: Icf7cacd747ae6ec48c59ab92463405a5d7f48f95 --- Android.bp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Android.bp b/Android.bp index 24e6bb6..2c0deab 100644 --- a/Android.bp +++ b/Android.bp @@ -100,7 +100,7 @@ java_library_host { } java_library_host { - name: "doclava", + name: "doclava8", defaults: ["doclava_defaults"], srcs: [":doclava_sources_jdk8"], java_version: "1.8", @@ -111,7 +111,7 @@ java_library_host { } java_library_host { - name: "doclava-no-guava", + name: "doclava8-no-guava", defaults: ["doclava_defaults"], srcs: [":doclava_sources_jdk8"], java_version: "1.8", @@ -122,7 +122,7 @@ java_library_host { } java_library_host { - name: "doclava17", + name: "doclava", defaults: ["doclava_defaults"], srcs: [":doclava_sources_jdk17"], java_version: "17", @@ -132,7 +132,7 @@ java_library_host { } java_library_host { - name: "doclava17-no-guava", + name: "doclava-no-guava", defaults: ["doclava_defaults"], srcs: [":doclava_sources_jdk17"], java_version: "17", -- cgit v1.2.3 From 5a25aceed13e63a822d247be22e3b84267ce6081 Mon Sep 17 00:00:00 2001 From: Nikita Iashchenko Date: Tue, 31 Jan 2023 14:42:54 +0000 Subject: doclava17: Wrap primitives to int in FieldDocImpl#constantValue() FieldDocImpl#constantValue() should wrap byte, char and short to int. If not, then FieldInfo#makeHDF will attempt to pass `val` Character to `String.format("0x%04x", val)`, which would fail. Bug: 260694901 Test: ./gradlew doclava17:test Change-Id: Ide28b13c73e4b76f9a92bb2323b87a0caa203a8e --- .../com/google/doclava/javadoc/FieldDocImpl.java | 28 +++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/FieldDocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/FieldDocImpl.java index ef8c1b2..3f61a61 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/FieldDocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/FieldDocImpl.java @@ -105,7 +105,33 @@ class FieldDocImpl extends MemberDocImpl implements FieldDoc { @Override @Used(implemented = true) public Object constantValue() { - return variableElement.getConstantValue(); + var cv = variableElement.getConstantValue(); + if (cv == null) { + return null; + } + // cv is either a primitive type or a String + if (cv instanceof String) { + return cv; + } else if (cv instanceof Boolean b) { + return b; + } else if (cv instanceof Byte b) { + return (int) b; + } else if (cv instanceof Character c) { + return (int) c; + } else if (cv instanceof Double d) { + return d; + } else if (cv instanceof Float f) { + return f; + } else if (cv instanceof Integer i) { + return i; + } else if (cv instanceof Long l) { + return l; + } else if (cv instanceof Short s) { + return (int) s; + } else { + throw new IllegalArgumentException("Unexpected constant value of type " + cv.getClass() + + " when expected java.lang.String or primitive type"); + } } @Override -- cgit v1.2.3 From 3fbc8e330d06b2a5f0d4ce2d9c81429b6f06d536 Mon Sep 17 00:00:00 2001 From: Sorin Basca Date: Mon, 13 Feb 2023 13:26:05 +0000 Subject: Implement ErrorType Bug: 260694901 Test: TH Change-Id: I43b73bf5712af79b614d97716dcb677c17f8e1fc --- .../google/doclava/javadoc/DocletElementUtils.java | 4 ++ .../com/google/doclava/javadoc/ErrorTypeImpl.java | 61 ++++++++++++++++++++++ .../com/google/doclava/javadoc/ParameterImpl.java | 3 -- .../java/com/google/doclava/javadoc/TypeImpl.java | 9 ++++ 4 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 doclava17/src/main/java/com/google/doclava/javadoc/ErrorTypeImpl.java diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/DocletElementUtils.java b/doclava17/src/main/java/com/google/doclava/javadoc/DocletElementUtils.java index d5fb34c..927c572 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/DocletElementUtils.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/DocletElementUtils.java @@ -127,6 +127,7 @@ class DocletElementUtils { public TypeElement getEnclosingTypeElement(Element e) { if (isPackage(e)) { return null; + } Element encl = e.getEnclosingElement(); if (isPackage(encl)) { @@ -134,6 +135,9 @@ class DocletElementUtils { } while (!(isClass(encl) || isEnum(encl) || isInterface(encl) || isAnnotation(encl))) { encl = encl.getEnclosingElement(); + if (encl == null) { + return null; + } } return (TypeElement) encl; } diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/ErrorTypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/ErrorTypeImpl.java new file mode 100644 index 0000000..4ab82a6 --- /dev/null +++ b/doclava17/src/main/java/com/google/doclava/javadoc/ErrorTypeImpl.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2003, 2023, 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. + */ + +package com.google.doclava.javadoc; + +import com.google.doclava.annotation.Unused; +import com.google.doclava.annotation.Used; +import com.sun.javadoc.AnnotationDesc; +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.ProgramElementDoc; +import com.sun.javadoc.Type; +import com.sun.javadoc.TypeVariable; +import java.util.Objects; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; + +class ErrorTypeImpl extends ClassDocImpl { + + private final javax.lang.model.type.ErrorType errorType; + + protected ErrorTypeImpl(TypeElement el, javax.lang.model.type.ErrorType errorType, + Context context) { + super(el, context); + this.errorType = errorType; + } + + static ErrorTypeImpl create(javax.lang.model.type.ErrorType errorType, + Context context) { + var typeEl = (TypeElement) errorType.asElement(); + return (ErrorTypeImpl) context.caches.classes.computeIfAbsent(typeEl, + el -> new ErrorTypeImpl(el, errorType, context)); + } + + @Override + @Used(implemented = true) + public boolean isIncluded() { + return false; + } +} diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/ParameterImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/ParameterImpl.java index 94da81a..4b32607 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/ParameterImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/ParameterImpl.java @@ -72,9 +72,6 @@ class ParameterImpl implements Parameter { } else { result = type.qualifiedTypeName() + type.dimension(); } - if (result.contains("<")) { - throw new RuntimeException("qwe"); - } return result; } diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java index e933b31..96b2c2e 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/TypeImpl.java @@ -38,6 +38,7 @@ import javax.lang.model.element.ElementKind; import javax.lang.model.element.TypeElement; import javax.lang.model.type.ArrayType; import javax.lang.model.type.DeclaredType; +import javax.lang.model.type.ErrorType; import javax.lang.model.type.PrimitiveType; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.SimpleTypeVisitor14; @@ -99,6 +100,14 @@ abstract class TypeImpl implements Type { // e.g. Object.superclass() yield null; } + case ERROR -> { + var errorType = (ErrorType) m; + var el = (TypeElement) errorType.asElement(); + if (el.getKind() == ElementKind.ANNOTATION_TYPE) { + yield AnnotationTypeDocImpl.create(el, context); + } + yield ErrorTypeImpl.create(errorType, context); + } default -> throw new IllegalArgumentException( "Unexpected type of kind: " + m.getKind()); }; -- cgit v1.2.3 From 44251deebf0d37aded4b70ed572927fccfeff70a Mon Sep 17 00:00:00 2001 From: Sorin Basca Date: Wed, 22 Feb 2023 14:18:36 +0000 Subject: Downgrade errors found with javadoc from JDK 17 Bug: 260694901 Test: TH Change-Id: I0e7cd0138daf7f04c549565b3ba29a7e99cc1e13 --- doclava17/src/main/java/com/google/doclava/Doclava.java | 6 ++++-- .../main/java/com/google/doclava/javadoc/ProgramElementDocImpl.java | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/doclava17/src/main/java/com/google/doclava/Doclava.java b/doclava17/src/main/java/com/google/doclava/Doclava.java index ae0cf33..e164faa 100644 --- a/doclava17/src/main/java/com/google/doclava/Doclava.java +++ b/doclava17/src/main/java/com/google/doclava/Doclava.java @@ -523,7 +523,8 @@ public class Doclava implements Doclet { @Override public List getNames() { return names; } @Override public String getParameters() { return ""; } @Override public boolean process(String opt, List arguments) { - Errors.setWarningsAreErrors(true); + // b/270335911: disable warnings as errors until new findings are addressed. + // Errors.setWarningsAreErrors(true); return true; } } @@ -538,7 +539,8 @@ public class Doclava implements Doclet { @Override public List getNames() { return names; } @Override public String getParameters() { return ""; } @Override public boolean process(String opt, List arguments) { - Errors.setLintsAreErrors(true); + // b/270335653: disable lint warnings as errors until new findings are addressed. + // Errors.setLintsAreErrors(true); return true; } } diff --git a/doclava17/src/main/java/com/google/doclava/javadoc/ProgramElementDocImpl.java b/doclava17/src/main/java/com/google/doclava/javadoc/ProgramElementDocImpl.java index eab079b..bdf49de 100644 --- a/doclava17/src/main/java/com/google/doclava/javadoc/ProgramElementDocImpl.java +++ b/doclava17/src/main/java/com/google/doclava/javadoc/ProgramElementDocImpl.java @@ -137,6 +137,8 @@ abstract class ProgramElementDocImpl extends DocImpl imple if (annotations == null) { annotations = element.getAnnotationMirrors() .stream() + // b/270334687: Filter out elements that are not ANNOTATION_TYPE + .filter(am -> ((TypeElement) am.getAnnotationType().asElement()).getKind() == ElementKind.ANNOTATION_TYPE) .map(am -> new AnnotationDescImpl(am, context)) .toArray(AnnotationDescImpl[]::new); } -- cgit v1.2.3 From 56ccfab34bffb70e26e8d9f44e6e1241760f754b Mon Sep 17 00:00:00 2001 From: Anton Hansson Date: Wed, 4 Oct 2023 16:28:29 +0000 Subject: Make doclava treat lint warnings as errors again This was turned off because of a large number of existing issues. These have now been baselined or fixed, so reenable the error. Bug: 217734059 Test: m docs Change-Id: Ic4947568c125630e8a462a0d175cb1010228ff8c --- src/com/google/doclava/Doclava.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/google/doclava/Doclava.java b/src/com/google/doclava/Doclava.java index 5ab2b65..0f7ab3b 100644 --- a/src/com/google/doclava/Doclava.java +++ b/src/com/google/doclava/Doclava.java @@ -543,8 +543,7 @@ public class Doclava implements Doclet { @Override public List getNames() { return names; } @Override public String getParameters() { return ""; } @Override public boolean process(String opt, List arguments) { - // b/270335653: disable lint warnings as errors until new findings are addressed. - // Errors.setLintsAreErrors(true); + Errors.setLintsAreErrors(true); return true; } } -- cgit v1.2.3