gpt4 book ai didi

android - 如何从 Java 源代码中获取 UAnnotation 的限定名称?

转载 作者:行者123 更新时间:2023-12-04 13:39:35 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的 Android lint 检查,以确保您使用特定的可空性注释。但由于某种原因,我无法获得注释的完全限定名称。

这是测试用例:

val input = """
package foo;

import org.jetbrains.annotations.NotNull;

public class Bar {
@NotNull String text;

Bar(@NotNull String text) {
this.text = text;
}
}
""".trimIndent()

lint().files(java(input))
.issues(NullAnnotationDetector.ISSUE)
.run()
// expect and all the info

这是检测器中的逻辑:
class NullAnnotationDetector: Detector(), SourceCodeScanner {

// companion object with the Issue itself

private lateinit var uastHandler: UElementHandler

override fun getApplicableUastTypes(): List<Class<out UElement>>? =
listOf(UAnnotation::class.java)

override fun createUastHandler(context: JavaContext): UElementHandler? {
uastHandler = NullHandler(context)
return uastHandler
}

private class NullHandler(val context: JavaContext) : UElementHandler() {
override fun visitAnnotation(node: UAnnotation) {
val x = node.qualifiedName // for some reason this is just "NotNull"

// context.report and all those kind of stuff
}
}
}

问题是,如果我将输入转换为 kotlin, node.qualifiedName返回完全限定名称 ( org.jetbrains.annotations.NotNull)。如何使用 java() 获得相同的结果? ?

最佳答案

我换了

node.qualifiedName


node.javaPsi?.qualifiedName

在我的测试中,我必须添加我正在测试的类的完整定义,在你的情况下是这样的:
   lint()
.files(
notNullClass(),
java( """
package foo;

import org.jetbrains.annotations.NotNull;

public class Bar {
@NotNull String text;

Bar(@NotNull String text) {
this.text = text;
}
}
""".trimIndent()
)
)
.run()
.expectErrorCount(1)

notNullClass() 定义为:
companion object {

fun notNullClass(): TestFile = java(
"src/org/jetbrains/annotations/NotNull.java",
"""

package org.jetbrains.annotations;

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.CLASS)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.TYPE_USE})
public @interface NotNull {

String value() default "";

Class<? extends Exception> exception() default Exception.class;
}


""".trimIndent()
)
}

关于android - 如何从 Java 源代码中获取 UAnnotation 的限定名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59394261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com