kotlin注释处理器中的可空类型

我正在为Kotlin设计注释处理器,并且因为处理过的元素是用Java编写的,所以我没有收到可空字符? 而不是使用@Nullable注释,这很好,但我正在接受类型和高级函数中的空参数问题,对于普通参数。

var someNullField: String? = "" 

我将在其注释中使用@org.jetbrains.annotations.Nullable来接收java.lang.String

但是List<String?>例如会返回我java.util.List<java.lang.String>而没有任何注释不在主要元素中,也不在类型参数中导致未知的可空性状态

我尝试使用javax.lang.model.util.Types来查找某种结果,但没有任何结果。

我现在使用的一些代码:

val utils = processingEnvironment.typeUtils
val type = fieldElement.asType()
if (type is DeclaredType) {
    val typeElement = utils.asElement(type)
    type.typeArguments
            .forEach {
                //Trying different ways and just printing for possible results
                val capture = utils.capture(it)
                val erasure = utils.erasure(it)
                val element = utils.asElement(it)
                printMessage("element: $element isNullable: ${element.isNullable()} isNotNull: ${element.isNotNull()}ncapture: $capture isNullable: ${capture.isNullable()} isNotNull: ${capture.isNotNull()}nerasure: $erasure isNullable: ${erasure.isNullable()} isNotNull: ${erasure.isNotNull()}")
            }
}

所有的帮助将不胜感激。


有一点必要的历史:从Java 6开始(当公开镜像API时),Java注释不能用于任何事物,但是可以通过反射访问相同类型的顶级元素。 您可以注释类,方法和字段,但不能注释类型参数( List<String> )或局部变量( String value = ... )。 Sun / Oracle工程师已经承认这一限制,而在Java 8中诞生了所谓的“类型注释”。

类型注释的目标类型可以是:局部变量类型,数组组件类型,类型变量类型,甚至返回类型(后面的注释类似地放置,但与方法上的旧派注释不同!)。 类型注释是通过新的@Target值创建的:ElementType#TYPE_USE。

当Kotlin人写作时

List<String?>

这真的意味着

List<@Nullable String>

它可以理解为:“可空字符串元素列表”。

由于类型本身是有针对性的,因此需要通过检查其原始类型TypeMirror (不要打扰已删除或捕获的类型镜像,它们与源代码没有足够的连接来保留注释)来获取注释。 巧合的是,镜像API被重构,导致新的接口AnnotatedConstruct,并方便地使TypeMirror它的后代。


现在,坏消息是:到Java 8发布时,对检查类型注释的支持显然不是生产就绪的,因此它被屠杀了。 JSR已被重写为暗示“TypeMirror#getAnnotationMirrors”应该不会返回任何内容。

从公共API中删除的支持位仍然可以通过Oracle特定于供应商的Tree API获得(仅在javac中支持)。 Tree#getTypeMirror返回的TypeMirror可能按照您期望的方式包含注释。 但是由于它有问题,你只能通过一系列的黑客获得注释,并且最终,这不会在任何时候都工作(例如在嵌套类型参数的情况下)。 在这个方向看到这个问题的一些研究。

该混乱的修复已在Java 9中合并。我还没有测试过它,但它看起来像TypeMirror#getAnnotationMirrors最终可能会工作。 目前还没有计划将此修复恢复到较旧的Java版本。

链接地址: http://www.djcxy.com/p/40265.html

上一篇: Nullable types in kotlin annotation processor

下一篇: Java, Assertions and the JIT