Home > Blockchain >  Kotlin DSL - type inference on returned value
Kotlin DSL - type inference on returned value

Time:05-21

I'm trying to introduce the following (simplified) DSL:

fun <T> myDsl(specFn: DslSpec<T>.() -> Unit) {
    val value = DslSpec<T>().apply(specFn).fn!!()
    println("value is: $value")
}

class DslSpec<T> {
    internal var fn: (() -> T)? = null
    fun getValue(fn: () -> T) {
        this.fn = fn
    }
}

fun testCase() {
    myDsl {
        getValue {
            "abc"
        }
    }
}

But it fails to infer T based just on the returned type of getValue ("Not enough information to infer type variable T"). I kind of see how it could be a very hard task to do for a compiler, but thought maybe there are already some tricks to make constructs like this work?

CodePudding user response:

If you're using a version of Kotlin < 1.6.0, you should add @BuilderInference to the specFn argument:

fun <T> myDsl(@BuilderInference specFn: DslSpec<T>.() -> Unit) {
    ...
}

https://pl.kotl.in/__xy04j88

If you're using a version >= 1.6.0, you should either use the annotation as well, or both your declarations and their usages must be compiled with the compiler argument -Xenable-builder-inference.

  • Related