All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.williamwebb.auto.stub.AutoStubProcessor.kt Maven / Gradle / Ivy

The newest version!
package io.williamwebb.auto.stub

import com.google.auto.service.AutoService
import java.util.*
import javax.annotation.processing.*
import javax.lang.model.SourceVersion
import javax.lang.model.element.TypeElement
import javax.lang.model.util.Elements
import javax.lang.model.util.Types

/**
 * Created by williamwebb on 3/6/16.
 */

@AutoService(Processor::class)
open class AutoStubProcessor : AbstractProcessor() {

  private var typeUtils: Types? = null
  private var elementUtils: Elements? = null
  private var filer: Filer? = null
  private var messager: Messager? = null

  @Synchronized override fun init(processingEnv: ProcessingEnvironment) {
    super.init(processingEnv)

    typeUtils = processingEnv.typeUtils
    elementUtils = processingEnv.elementUtils
    filer = processingEnv.filer
    messager = processingEnv.messager
  }

  override fun process(set: Set, env: RoundEnvironment): Boolean {
    var models = ArrayList()
    try {
      models.addAll(getModels(env))
    } catch(cnfe :ClassNotFoundException) {
      error("The artifact to be stubbed must be added in provided and apt scope.")
    }

    models.forEach {
      StubGenerator(it).brewJava().writeTo(filer)
    }

    return true
  }

  private fun getModels(environment: RoundEnvironment): List {
    return environment.getElementsAnnotatedWith(AutoStub::class.java)
      .map { it.getAnnotation(AutoStub::class.java) }
      .map { it.value.toList() }
      .flatMap { it }
      .map { Class.forName(it.className()) }
      .map {
        createStubModel(it, it.`package`.name)
      }
  }

  private fun createStubModel(clazz: Class<*>, packageName: String): StubModel =
      StubModel(
          clazz.simpleName,
          packageName,
          clazz.modifiers(),
          clazz.declaredConstructors,
          clazz.declaredMethods,
          processInnerClasses(packageName, clazz)
      )

  private fun processInnerClasses(parent: String, clazz: Class<*>): List {
    return clazz.declaredClasses.map {
      createStubModel(it, "${clazz.`package`.name}.$parent")
    }.toList()
  }

  override fun getSupportedSourceVersion(): SourceVersion {
    return SourceVersion.latestSupported()
  }

  override fun getSupportedAnnotationTypes(): Set {
    return setOf(AutoStub::class.java.canonicalName)
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy