使用Language注释,可以告诉IntelliJ将参数视为给定语言,以便可以启用自动完成和其他IDE工具。
这也可以用于接收器参数,或者是否有其他方法可以获得扩展类型的语言功能。
我试过了:
fun @Language("SQL") String.trimSQL() = this.trimMargin()
但这会产生错误:
Error:(57, 5) Kotlin: This annotation is not applicable to target 'type usage'
答案 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上提交一个关于它的问题。