gsonpath.GsonProcessor.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gsonpath-compiler Show documentation
Show all versions of gsonpath-compiler Show documentation
An annotation processor which generates Type Adapters for the Google Gson library
package gsonpath
import com.google.common.collect.Sets
import gsonpath.adapter.AdapterGenerationResult
import gsonpath.adapter.enums.EnumAdapterFactory
import gsonpath.adapter.standard.StandardAdapterFactory
import gsonpath.adapter.subType.SubTypeAdapterFactory
import gsonpath.dependencies.Dependencies
import gsonpath.dependencies.DependencyFactory
import gsonpath.util.Logger
import javax.annotation.processing.AbstractProcessor
import javax.annotation.processing.RoundEnvironment
import javax.lang.model.SourceVersion
import javax.lang.model.element.TypeElement
open class GsonProcessor : AbstractProcessor() {
override fun process(annotations: Set?, env: RoundEnvironment): Boolean {
if (annotations == null) {
return false
}
val logger = Logger(processingEnv)
try {
processInternal(annotations, env, logger)
} catch (e: ProcessingException) {
logger.printError(e.message, e.element)
}
return false
}
private fun processInternal(annotations: Set, env: RoundEnvironment, logger: Logger) {
println()
logger.printMessage("Started annotation processing")
val dependencies = DependencyFactory.create(processingEnv)
val autoGsonAdapterResults = StandardAdapterFactory.generateGsonAdapters(env, logger, annotations, dependencies)
.plus(SubTypeAdapterFactory.generateGsonAdapters(env, logger, annotations, dependencies))
.plus(EnumAdapterFactory.generateGsonAdapters(env, logger, annotations, dependencies))
generateTypeAdapterFactories(env, dependencies, autoGsonAdapterResults)
logger.printMessage("Finished annotation processing")
println()
}
private fun generateTypeAdapterFactories(
env: RoundEnvironment,
dependencies: Dependencies,
autoGsonAdapterResults: List) {
if (autoGsonAdapterResults.isNotEmpty()) {
val gsonPathFactories = env.getElementsAnnotatedWith(AutoGsonAdapterFactory::class.java)
when {
gsonPathFactories.count() == 0 -> {
throw ProcessingException("An interface annotated with @AutoGsonAdapterFactory (that directly extends " +
"com.google.gson.TypeAdapterFactory) must exist before the annotation processor can succeed. " +
"See the AutoGsonAdapterFactory annotation for further details.")
}
gsonPathFactories.count() > 1 -> {
throw ProcessingException("Only one interface annotated with @AutoGsonAdapterFactory can exist")
}
else -> {
val factoryElement = gsonPathFactories.first()
dependencies.typeAdapterFactoryGenerator.generate(factoryElement as TypeElement, autoGsonAdapterResults)
}
}
}
}
override fun getSupportedAnnotationTypes(): Set {
return Sets.newHashSet("*")
}
override fun getSupportedSourceVersion(): SourceVersion {
return SourceVersion.latestSupported()
}
}