diff options
author | Sorin Basca <sorinbasca@google.com> | 2023-04-17 15:51:30 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2023-04-17 15:51:30 +0000 |
commit | 36c2ebed082ad38bb7473416adc0c9b4090ef7b3 (patch) | |
tree | 14aa574545228618d5e76f021ef8eefa62c96ed4 | |
parent | 34a3c520d896e97fbfa0c458f4c6f860f5080f7d (diff) | |
parent | 2ac9699ef0050cc4da894f07eb2e34f1ac043b81 (diff) | |
download | doclava-36c2ebed082ad38bb7473416adc0c9b4090ef7b3.tar.gz |
Merge "Improve representation of parameterized supertypes and interfaces"
-rw-r--r-- | doclet_adapter/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java | 25 | ||||
-rw-r--r-- | doclet_adapter/src/main/java/com/google/doclava/javadoc/ErrorTypeImpl.java | 12 |
2 files changed, 21 insertions, 16 deletions
diff --git a/doclet_adapter/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java b/doclet_adapter/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java index 8bd6d5e..0b6ec3e 100644 --- a/doclet_adapter/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java +++ b/doclet_adapter/src/main/java/com/google/doclava/javadoc/ClassDocImpl.java @@ -255,12 +255,7 @@ class ClassDocImpl extends ProgramElementDocImpl<TypeElement> implements ClassDo if (superclassMirror.getKind() == TypeKind.NONE) { return null; } - Type t = TypeImpl.create(superclassMirror, context); - if (t instanceof ClassDoc cls) { - return cls; - } else { - return null; - } + return TypeImpl.create(superclassMirror, context).asClassDoc(); } @Override @@ -273,14 +268,7 @@ class ClassDocImpl extends ProgramElementDocImpl<TypeElement> implements ClassDo 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) { - return pt; - } else { - return null; - } + return TypeImpl.create(superclassMirror, context); } @Override @@ -313,7 +301,14 @@ class ClassDocImpl extends ProgramElementDocImpl<TypeElement> implements ClassDo @Override @Used(implemented = true) public Type[] interfaceTypes() { - return interfaces(); + if (interfaceTypes == null) { + interfaceTypes = typeElement.getInterfaces() + .stream() + .filter(typeMirror -> !typeMirror.getKind().equals(TypeKind.NONE)) + .map(typeMirror -> TypeImpl.create(typeMirror, context)) + .toArray(Type[]::new); + } + return interfaceTypes; } @Override diff --git a/doclet_adapter/src/main/java/com/google/doclava/javadoc/ErrorTypeImpl.java b/doclet_adapter/src/main/java/com/google/doclava/javadoc/ErrorTypeImpl.java index 4ab82a6..e7faa7f 100644 --- a/doclet_adapter/src/main/java/com/google/doclava/javadoc/ErrorTypeImpl.java +++ b/doclet_adapter/src/main/java/com/google/doclava/javadoc/ErrorTypeImpl.java @@ -49,8 +49,18 @@ class ErrorTypeImpl extends ClassDocImpl { static ErrorTypeImpl create(javax.lang.model.type.ErrorType errorType, Context context) { var typeEl = (TypeElement) errorType.asElement(); - return (ErrorTypeImpl) context.caches.classes.computeIfAbsent(typeEl, + var typeImpl = context.caches.classes.computeIfAbsent(typeEl, el -> new ErrorTypeImpl(el, errorType, context)); + + // On rare occasions it can happen that the errorType had already been cached as a + // ClassDocImpl instead of ErrorTypeImpl. In that case recreate the ErrorTypeImpl and store + // it in the cache. + if (!(typeImpl instanceof ErrorTypeImpl)) { + typeImpl = new ErrorTypeImpl(typeEl, errorType, context); + context.caches.classes.put(typeEl, typeImpl); + } + + return (ErrorTypeImpl)typeImpl; } @Override |