Я пишу пользовательскую @Builder
библиотеку обработки аннотаций (аналогично Project Lombok ) с Java-модулем в Android Studio .Вместо создания Java-модуля и написания на Java, я хочу написать его на Kotlin.
Поскольку в Android Studio отсутствует опция Kotlin Module , я запустил новый Java-модуль и написал на Java.
@AutoService(Processor.class)
public class BuilderProcessor extends AbstractProcessor {
private Filer filer;
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
for (Element element : roundEnvironment.getElementsAnnotatedWith(Builder.class)){
TypeSpec binder = createClass(element.getSimpleName().toString());
TypeElement typeElement = (TypeElement) element;
JavaFile javaFile = JavaFile.builder(getPackage(typeElement.getQualifiedName().toString()), binder).build();
try {
javaFile.writeTo(filer);
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
@Override
public Set<String> getSupportedAnnotationTypes() {
Set<String> annotations = new LinkedHashSet<>();
for (Class<? extends Annotation> annotation : Collections.singleton(Builder.class)) {
annotations.add(annotation.getCanonicalName());
}
return annotations;
}
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
this.filer = processingEnvironment.getFiler();
}
private String getPackage(String s){
return s.substring(0, s.lastIndexOf('.'));
}
private TypeSpec createClass(String className){
return TypeSpec.classBuilder(className + "Builder")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.build();
}
}
Приведенный выше код работает довольно хорошо и создает класс UserBuilder.java
, если есть аннотация @Builder
поверх User
класса.
Теперь я хотел конвертировать в Kotlin.Итак, я преобразовал код в Kotlin
@AutoService(Processor::class)
class BuilderProcessor : AbstractProcessor() {
private var filer: Filer? = null
override fun process(set: Set<TypeElement>, roundEnvironment: RoundEnvironment): Boolean {
for (element in roundEnvironment.getElementsAnnotatedWith(Builder::class.java)) {
val binder = createClass(element.simpleName.toString())
val typeElement = element as TypeElement
val javaFile = JavaFile.builder(getPackage(typeElement.qualifiedName.toString()), binder).build()
try {
javaFile.writeTo(filer!!)
} catch (e: IOException) {
e.printStackTrace()
}
}
return false
}
override fun getSupportedAnnotationTypes(): Set<String> {
val annotations = LinkedHashSet<String>()
for (annotation in setOf(Builder::class.java)) {
annotations.add(annotation.canonicalName)
}
return annotations
}
@Synchronized
override fun init(processingEnvironment: ProcessingEnvironment) {
super.init(processingEnvironment)
this.filer = processingEnvironment.filer
}
private fun getPackage(s: String): String {
return s.substring(0, s.lastIndexOf('.'))
}
private fun createClass(className: String): TypeSpec {
return TypeSpec.classBuilder(className + "Builder")
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.build()
}
}
, а также настроил оценку с помощью Kotlin
plugins {
id 'org.jetbrains.kotlin.jvm'
}
apply plugin: 'java-library'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
api 'com.google.guava:guava:27.0.1-android'
implementation 'com.squareup:javapoet:1.9.0'
implementation 'com.google.auto.service:auto-service:1.0-rc2'
implementation project(':builder')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}
sourceCompatibility = "7"
targetCompatibility = "7"
repositories {
mavenCentral()
}
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
Но, к сожалению, при сборке он не работает.Он строит, но не генерирует UserBuilder.java
класс.Я делаю это неправильно или есть какой-то шаг, который я должен был сделать?
Существует версия Kotlin Project Lombok для ссылки .