Skip to content

Instantly share code, notes, and snippets.

@navi25
Created December 24, 2018 04:47
Show Gist options
  • Save navi25/8525f4045029d605d1b7f1690cd14b0e to your computer and use it in GitHub Desktop.
Save navi25/8525f4045029d605d1b7f1690cd14b0e to your computer and use it in GitHub Desktop.
A simple abstract processor class to generate Greeting Class based on GreetingGenerator Annotation.
package io.navendra.codegen
import com.google.auto.service.AutoService
import io.navendra.annotation.GreetingGenerator
import io.navendra.codegen.simplePoet.KotlinClassBuilder
import java.io.File
import javax.annotation.processing.*
import javax.lang.model.SourceVersion
import javax.lang.model.element.TypeElement
@AutoService(Processor::class) // For registering the service
@SupportedSourceVersion(SourceVersion.RELEASE_8) // to support Java 8
@SupportedOptions(FileGenerator.KAPT_KOTLIN_GENERATED_OPTION_NAME)
class FileGenerator : AbstractProcessor(){
override fun getSupportedAnnotationTypes(): MutableSet<String> {
return mutableSetOf(GreetingGenerator::class.java.name)
}
override fun getSupportedSourceVersion(): SourceVersion {
return SourceVersion.latest()
}
override fun process(set: MutableSet<out TypeElement>?, roundEnvironment: RoundEnvironment?): Boolean {
roundEnvironment?.getElementsAnnotatedWith(GreetingGenerator::class.java)
?.forEach {
val className = it.simpleName.toString()
val pack = processingEnv.elementUtils.getPackageOf(it).toString()
generateClass(className, pack)
}
return true
}
private fun generateClass(className: String, pack: String){
val fileName = "Generated_$className"
val fileContent = KotlinClassBuilder(fileName,pack).getContent()
val kaptKotlinGeneratedDir = processingEnv.options[KAPT_KOTLIN_GENERATED_OPTION_NAME]
val file = File(kaptKotlinGeneratedDir, "$fileName.kt")
file.writeText(fileContent)
}
companion object {
const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment