Example #1
0
    @Value.Lazy
    public Optional<AbstractDeclaring> typeAdaptersProvider() {
      Optional<DeclaringType> typeDefining =
          declaringType().isPresent()
              ? Optional.of(declaringType().get().associatedTopLevel())
              : Optional.<DeclaringType>absent();

      Optional<TypeAdaptersMirror> typeDefined =
          typeDefining.isPresent()
              ? typeDefining.get().typeAdapters()
              : Optional.<TypeAdaptersMirror>absent();

      Optional<TypeAdaptersMirror> packageDefined = packageOf().typeAdapters();

      if (packageDefined.isPresent()) {
        if (typeDefined.isPresent()) {
          report()
              .withElement(typeDefining.get().element())
              .annotationNamed(TypeAdaptersMirror.simpleName())
              .warning(
                  "@%s is also used on the package, this type level annotation is ignored",
                  TypeAdaptersMirror.simpleName());
        }
        return Optional.<AbstractDeclaring>of(packageOf());
      }

      return typeDefined.isPresent()
          ? Optional.<AbstractDeclaring>of(typeDefining.get())
          : Optional.<AbstractDeclaring>absent();
    }
Example #2
0
    @Value.Lazy
    public Optional<RepositoryMirror> repository() {
      if (!declaringType().isPresent()) {
        return Optional.absent();
      }

      Optional<RepositoryMirror> repositoryMirror =
          kind().isIncluded() || kind().isDefinedValue()
              ? declaringType().get().repository()
              : Optional.<RepositoryMirror>absent();

      if (repositoryMirror.isPresent() && !typeAdaptersProvider().isPresent()) {
        if (kind().isNested()) {
          report()
              .annotationNamed(RepositoryMirror.simpleName())
              .error(
                  "@Mongo.%s should also have associated @Gson.%s on a top level type.",
                  RepositoryMirror.simpleName(), TypeAdaptersMirror.simpleName());
        } else {
          report()
              .annotationNamed(RepositoryMirror.simpleName())
              .warning(
                  "@Mongo.%s types better have explicit @Gson.%s annotation"
                      + " be placed on the class or enclosing package."
                      + " It is also common to forget to generate type adapters"
                      + " for nested document classes, which will fallback to reflective Gson adapter otherwise.",
                  RepositoryMirror.simpleName(), TypeAdaptersMirror.simpleName());
        }
      }

      return repositoryMirror;
    }
Example #3
0
    /**
     * Default type adapters should only be called if {@code Gson.TypeAdapters} annotation is
     * definitely in classpath. Currenlty, it is called by for mongo repository module, which have
     * {@code gson} module as a transitive dependency.
     *
     * @return default type adapters
     */
    @Value.Lazy
    TypeAdaptersMirror defaultTypeAdapters() {
      @Nullable
      TypeElement typeElement =
          processing().getElementUtils().getTypeElement(TypeAdaptersMirror.qualifiedName());

      Preconditions.checkState(
          typeElement != null,
          "Processor internal error, @%s is not know to be on the classpath",
          TypeAdaptersMirror.qualifiedName());

      return TypeAdaptersMirror.from(typeElement);
    }
Example #4
0
 @Value.Lazy
 public Optional<TypeAdaptersMirror> typeAdapters() {
   return TypeAdaptersMirror.find(element());
 }