@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(); }
@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; }
/** * 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); }
@Value.Lazy public Optional<TypeAdaptersMirror> typeAdapters() { return TypeAdaptersMirror.find(element()); }