工具中的宏支持

Macros support in tooling

https://www.reddit.com/r/Kotlin/comments/7hoytl/kotlin_team_ama_ask_us_anything/dqt56nv/

Traditional macros are very hard to support well in the tooling

在Java我们已经有了Lombok @Data 什么生成方法,几乎​​和宏一样。 https://projectlombok.org/features/Data

为什么工具很难支持宏?

工具可能意味着很多不同的东西,从实现宏转换的二进制代码的低级,到您正在实现或使用宏的 IDE 的高级,这就是阿布雷斯拉夫提到。由于宏可以改变它们包含的代码的含义,因此您开始遇到 问题 ,比如决定要向用户显示哪种源代码。

想象一下有一个宏,它在所有属性前加上一个字符串,在连接标识符期间自然地大写原始变量:

someclass {
    prefix("longPrefix") {
        val a: String = ""
    }

    fun bar() {
        println("Look at $longPrefixA")
    }
}

想象一下这个编译和工作,你很难回答设计决策,因为你显示的是 宏转换之前的原始源......但是它对还看到代码after?此外,部分源代码取决于 运行 的宏,这反过来意味着 IDE 必须实际编译并且 运行 您的代码,同时您正在键入以验证引用到 $longPrefixA 是有效的。在某种程度上,你需要一个 compilation time 的 compiler/IDE 调试器,就像你通常的 运行time 调试器一样,如果你正在编写宏第一名。

当你考虑控制流宏时,还有更多的麻烦,比如编译抽象语法树以不明显的方式被修改,这也是宏因 隐藏而声名狼藉的原因之一 程序(尽管我认为这主要来自我们的 C 文本预处理器有偏见的历史)。即使您查看具有内置宏支持的其他编程语言,它们的工具也往往乏善可陈,在某种程度上延续了模因。

如果使用正确的方法,IDE 中的宏并不难支持。

关键是使用相同的编译器来处理IDE中的语义特征。