【问题标题】:Putting language annotations on extension method receiver将语言注释放在扩展方法接收器上
【发布时间】:2018-03-15 18:56:31
【问题描述】:

使用 Language 注释,可以告诉 IntelliJ 将参数视为给定语言,以便启用自动完成和其他 IDE 工具。

这也可以用于接收器参数,或者有其他方法来获取扩展类型的语言特性。

我试过了:

fun @Language("SQL") String.trimSQL() = this.trimMargin()

但这给出了错误:

Error:(57, 5) Kotlin: This annotation is not applicable to target 'type usage'

【问题讨论】:

    标签: intellij-idea kotlin


    【解决方案1】:

    目前没有办法做到这一点。如果您在 String 类型上创建扩展,它将在您创建扩展的范围内的所有 Strings 上可用,并且无法考虑注释。

    Typealiases 基本上也被忽略了,因此即使您要为 String 引入 SQLString 类型别名并在其上创建扩展,该扩展也可用于任何 String 实例。


    编辑:@yole 在下面的评论中有一个很好的观点,我可能误解了这个问题。如果你想注释函数调用的接收者以便 IntelliJ 可以接收它,就像这样的方法:

    fun trimSQL(@Language("SQL") str: String) = str.trimMargin()
    

    ...那么您必须使用带有注释的use-site target,以便将其应用于接收者(即应用于生成的静态方法的第一个参数)。

    fun @receiver:Language("SQL") String.trimSQL() = this.trimMargin()
    

    这确实在第一个参数上放置了适当的注释 - 查看字节码(以及从那里反编译的 Java),它们的签名除了参数名称之外都是相同的:

    @NotNull
    public static final String trimSQL2(@Language("SQL") @NotNull String str)
    

    但是,对于扩展功能的情况,IntelliJ 目前似乎无法接受这一点。也许值得在Kotlin issue tracker 上提交一个关于它的问题。

    【讨论】:

    猜你喜欢
    • 2021-10-09
    • 2013-11-16
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多