我正在编写一些正则表达式繁重的代码,并且发现在Kotlin中使用正则表达式的常用语法是
"""a.*b""".toRegex()
有点冗长和分散我的口味。我想到可以通过在String上创建扩展属性来大大缩短它,这样我就可以编写如下代码:
"""a.*b""".rx
在语法层面上,我可以轻松地编写一个扩展函数来完成这项工作:
val String.rx : Regex
get() { return toRegex() }
但是,当我使用此字符串时,该字符串不再在IntelliJ Idea中以正则表达式(“语言注入”)的语法突出显示,就像我在.toRegex()上调用的原始字符串那样。
在其他类似情况下(例如,将字符串作为函数参数传递),我通过在有问题的函数参数中添加“ @Language(“ RegExp”)'注释来解决此问题,该注释为IntelliJ提供了足够的信息来知道传递的任何字符串函数的参数中应包含有效的正则表达式,并应将其突出显示。但是,我仍无法弄清楚如何将此注释应用于此扩展属性以实现相同的突出显示行为。
我首先尝试了显而易见的方法,尝试将注释放在属性内的每个可能位置,例如:
@Language("RegExp")
val String.rx : Regex
get() { return toRegex() }
或者这个:
val @Language("RegExp") String.rx : Regex
get() { return toRegex() }
但是Kotlin编译器不接受它。
然后,我查看了Kotlin文档here,该文档似乎暗示了为扩展名属性的接收者添加注释的正确语法可能是这样的:
@get:Language("RegExp")
val @receiver:Language("RegExp") String.rx : Regex
get() { return toRegex() }
这可以编译,但是对IntelliJ的语法突出显示没有影响。
我还没有成功声明一个普通的扩展函数(与扩展属性相对)来完成String.toRegex()在语法高亮化方面的工作。
奇怪的是,String.toRegex()函数本身没有相关的批注,所以我不知道IntelliJ如何决定它应将toRegex()调用的接收者突出显示为正则表达式,或者为什么不将其视为正则表达式我自己对扩展功能的尝试也是如此。
可以做到吗?如果是这样,为扩展属性和/或扩展功能声明注释的正确语法是什么,以便IntelliJ可以看到它并影响IntelliJ的语法突出显示?