将语言注释放在扩展方法接收器

时间:2018-03-15 18:56:32

标签: intellij-idea kotlin

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

这也可以用于接收器参数,或者是否有其他方法可以获得扩展类型的语言功能。

我试过了:

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

但这会产生错误:

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

1 个答案:

答案 0 :(得分:2)

目前无法做到这一点。如果您在String类型上创建了一个扩展程序,则该扩展程序将在您创建扩展程序的范围内的所有String上提供,并且无法将注释考虑在内。

Typealases也基本上被忽略了,所以即使您为SQLString引入String类型,并在其上创建扩展名,该扩展名也可用于任何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上提交一个关于它的问题。