Search code examples
androidarrow-ktkotlin-symbol-processing

how to configure ksp in my android gradle groovy dsl build files


im investigating the io.arrow.kt functional programming library in my current android project.

im having difficulty in configuring the optics module that employs ksp for source code generation

my project gradle resembles this

buildscript {
    ext.kotlin_version = "1.6.10"
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.40.5'
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
        maven { url 'https://jitpack.io' }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

with my android sub module resembling this

plugins {
    id "com.android.library"
    id "com.google.devtools.ksp" version "1.6.10-1.0.2"
    id "kotlin-android"
    id "kotlin-kapt"
    id 'org.jetbrains.kotlin.plugin.serialization' version '1.4.20'
    id 'dagger.hilt.android.plugin'
}

android {
    compileSdkVersion 32

    defaultConfig {
        minSdkVersion 26
        targetSdkVersion 32

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"

...

dependencies {

    api(platform("io.arrow-kt:arrow-stack:1.0.6-alpha.1"))
    api("io.arrow-kt:arrow-core")
    api("io.arrow-kt:arrow-fx-coroutines")
    api("io.arrow-kt:arrow-fx-stm")
    api("io.arrow-kt:arrow-optics")

    api "com.google.devtools.ksp:symbol-processing-api:1.6.10-1.0.2"
    ksp "io.arrow-kt:arrow-optics-ksp-plugin:1.0.6-alpha.1"

the optics code within my android kotlin code does not compile though

import arrow.optics.dsl.*
import arrow.optics.Optional
import arrow.optics.optics

@optics
data class Street(val number: Int, val name: String) {
    companion object
}

@optics
data class Address(val city: String, val street: Street) {
    companion object
}

@optics
data class Company(val name: String, val address: Address) {
    companion object
}

@optics
data class Employee(val name: String, val company: Company?) {
    companion object
}

fun what() {
    val john = Employee("John Doe", Company("Kategory", Address("Functional city", Street(42, "lambda street"))))
//
//    val optional: Optional<Employee, String> = Employee.company.address.street.name
//
//    optional.modify(john, String::toUpperCase)
}

as company is not found in the commented out code

does ksp work on android? what mistakes have i made in my gradle build files?


Solution

  • the solution i found was to downgrade the arrow gradle deps as shown below

    implementation(platform("io.arrow-kt:arrow-stack:1.0.3-alpha.1"))
    api("io.arrow-kt:arrow-core")
    api("io.arrow-kt:arrow-fx-coroutines")
    api("io.arrow-kt:arrow-fx-stm")
    api 'io.arrow-kt:arrow-optics'
    
    api "com.google.devtools.ksp:symbol-processing-api:1.6.10-1.0.2"
    

    i also had to add

    sourceSets {
        main {
            java {
                srcDir "${buildDir.absolutePath}/generated/ksp/"
            }
        }
    }