in crumb-compiler/src/main/kotlin/com/uber/crumb/CrumbProcessor.kt [141:187]
override fun init(processingEnv: ProcessingEnvironment) {
super.init(processingEnv)
typeUtils = processingEnv.typeUtils
elementUtils = processingEnv.elementUtils
crumbLog = if (processingEnv.options[OPTION_VERBOSE]?.toBoolean() == true) {
CrumbLog("CrumbProcessor", true, MessagerClient(processingEnv.messager))
} else {
CrumbLog("CrumbProcessor")
}
crumbManager = CrumbManager(processingEnv, crumbLog)
try {
if (loaderForExtensions != null) {
// ServiceLoader.load returns a lazily-evaluated Iterable, so evaluate it eagerly now
// to discover any exceptions.
producerExtensions = ServiceLoader.load(CrumbProducerExtension::class.java,
loaderForExtensions)
.iterator().asSequence().toSet()
consumerExtensions = ServiceLoader.load(CrumbConsumerExtension::class.java,
loaderForExtensions)
.iterator().asSequence().toSet()
}
} catch (t: Throwable) {
val warning = buildString {
append(
"An exception occurred while looking for Crumb extensions. " + "No extensions will function.")
if (t is ServiceConfigurationError) {
append(" This may be due to a corrupt jar file in the compiler's classpath.")
}
append(" Exception: ")
.append(t)
}
processingEnv.messager.printMessage(WARNING, warning, null)
producerExtensions = setOf()
consumerExtensions = setOf()
}
producerExtensions.plus(consumerExtensions).forEach { it.init(processingEnv) }
val producerAnnotatedAnnotations = producerExtensions.flatMap { it.supportedProducerAnnotations() }
.filter { it.getAnnotation(CrumbProducer::class.java) != null }
val consumerAnnotatedAnnotations = consumerExtensions.flatMap { it.supportedConsumerAnnotations() }
.filter { it.getAnnotation(CrumbConsumer::class.java) != null }
val baseCrumbAnnotations = listOf(CrumbConsumer::class, CrumbProducer::class,
CrumbConsumable::class)
.map { it.java }
supportedTypes = (baseCrumbAnnotations + producerAnnotatedAnnotations + consumerAnnotatedAnnotations)
.map { it.name }
.toSet()
}