Как сделать библиотеку Kotlin похожей на библиотеку Java? - PullRequest
0 голосов
/ 28 декабря 2018

Я пишу пользовательскую @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 для ссылки .

...