docs: protected ClassElement mirrorToClassElement(TypeMirror returnType, JavaVisitorContext visitorContext) {
          if (returnType instanceof NoType) {
              return new JavaVoidElement();
          } else if (returnType instanceof DeclaredType) {
              DeclaredType dt = (DeclaredType) returnType;
              Element e = dt.asElement();
              List<? extends TypeMirror> typeArguments = dt.getTypeArguments();
              if (e instanceof TypeElement) {
                  TypeElement typeElement = (TypeElement) e;
                  if (JavaModelUtils.resolveKind(typeElement, ElementKind.ENUM).isPresent()) {
                      return new JavaEnumElement(
                              typeElement,
                              visitorContext.getAnnotationUtils().getAnnotationMetadata(typeElement),
                              visitorContext,
                              typeArguments
                      );
                  } else {
                      return new JavaClassElement(
                              typeElement,
                              visitorContext.getAnnotationUtils().getAnnotationMetadata(typeElement),
                              visitorContext,
                              typeArguments
                      );
                  }
              }
          } else if (returnType instanceof TypeVariable) {
              TypeVariable tv = (TypeVariable) returnType;
              TypeMirror upperBound = tv.getUpperBound();
              ClassElement classElement = mirrorToClassElement(upperBound, visitorContext);
              if (classElement != null) {
                  return classElement;
              } else {
                  return mirrorToClassElement(tv.getLowerBound(), visitorContext);
              }
          } else if (returnType instanceof ArrayType) {
              ArrayType at = (ArrayType) returnType;
              TypeMirror componentType = at.getComponentType();
              ClassElement arrayType = mirrorToClassElement(componentType, visitorContext);
              if (arrayType != null) {
                  if (arrayType instanceof JavaPrimitiveElement) {
                      JavaPrimitiveElement jpe = (JavaPrimitiveElement) arrayType;
                      return jpe.toArray();
                  } else {
                      return new JavaClassElement((TypeElement) arrayType.getNativeType(), arrayType, visitorContext) {
                          @Override
                          public boolean isArray() {
                              return true;
                          }
                      };
                  }
              }
          } else if (returnType instanceof PrimitiveType) {
              PrimitiveType pt = (PrimitiveType) returnType;
              return JavaPrimitiveElement.valueOf(pt.getKind().name());
          }
          return null;
      }