Kotlin Annotation Processing:是否可以生成扩展方法?

问题描述:

我玩弄科特林,我认为,这将是巨大的,有“功能类别”,看到我想要的例子:Kotlin Annotation Processing:是否可以生成扩展方法?

functional class MyStrFunction(val function: MyStrFunction.(String) -> String) { 
    val memory = HashMap<String, String>() 
    fun output(message: String) = println(message) 
} 

的想法是,我将能够使用它像:

val f = MyStrFunction { 
    output("reversing $it"); 
    if (it in memory) 
     output(memory[it]) 
    return it.reverse() 
} 

如果我写MyStrFunction,我想通过我自己,结果类是:

class MyStrFunction(val function: MyStrFunction.(String) -> String) { 
    val memory = HashMap<String, String>() 
    fun output(message: String) = println(message) 

    public fun invoke(s: String) = this.function(s) 
} 

但是,在每个“功能类别”中用手写这个都很乏味。

所以这里是我的问题:是否有可能使functional注释,然后处理它添加invoke方法与所需的代码?

我知道kapt可以用于Kotlin注释处理,但是AFAIK现在不能生成Kotlin代码,并且没有办法在Java生成的代码中生成扩展函数。

有没有什么办法可以为一个类生成一个新的Kotlin方法?

节点:我知道功能类的想法很少有用例,并且手动添加所提到的invoke方法并不难,但对我来说它对Kotlin中注释处理的概念具有学术价值。

UPD:刚才我对功能类的想法:有委托接口的语言特性,它在这里很好用,但this引用在该块中不可见。例如:

class MyStrFunction(val function: MyStrFunction.(String) -> String) 
: (String) -> String by { this.function(it) } { // <-- won't compile :(
    val memory = HashMap<String, String>() 
    fun output(message: String) = println(message) 
} 
+0

您可以向[YouTrack](https://youtrack.jetbrains.com)搜索或添加问题,要求KAPT的功能生成Kotlin。这样您就可以跟踪该功能的进度。 –

不知道,如果你想要,可以直接做,但是什么这里没有“功能类”的做法。据我所知,你想添加功能,以正常的lambda函数。首先,定义功能作为一个普通类:

class Memory() { 
    val memory = hashMapOf<String, String>() 
    fun output(message: String) = println(message) 
} 

然后定义一个辅助函数来扩展功能结合到一个接收器:

fun <T, R, E> T.bind(function: T.(R) -> E): (R) -> E = { this.function(it) } 

,然后用它像这样

fun main(args: Array<String>) { 
    val mem = Memory() 

    val memoryFunction: Memory.(String) -> String = { 
     output("reversing $it"); 
     if (it in memory) 
      output(memory[it]) 
     it.reverse() 
    } 

    val function: (String) -> String = mem.bind(memoryFunction) 

    println(listOf("foo", "bar").map(function)) 
} 
+0

谢谢,您建议的方法在这种情况下看起来不错。 但是我仍然希望在类的用法上没有冗余和重复的代码,并且如果可能的话,即使没有额外的代码也是如此。 – hotkey