Android 在Kotlin中,我可以将lint应用于继承我指定的类的所有类的构造函数吗? class SomeDetector:Detector(),SourceCodeScanner{ 覆盖GetApplicatableConstructorTypes():列表{ 返回列表(父类) } 重写visitConstructor(上下文:JavaContext,节点:UCallExpression,构造函数:PsiMethod){ //布拉布拉。。。 } }

Android 在Kotlin中,我可以将lint应用于继承我指定的类的所有类的构造函数吗? class SomeDetector:Detector(),SourceCodeScanner{ 覆盖GetApplicatableConstructorTypes():列表{ 返回列表(父类) } 重写visitConstructor(上下文:JavaContext,节点:UCallExpression,构造函数:PsiMethod){ //布拉布拉。。。 } },android,kotlin,lint,Android,Kotlin,Lint,好的,我甚至成功地将lint应用于每个类的单个构造函数 然而,我想验证数百个类,它们都继承了一个公共接口 因此,我想验证继承我指定的接口的所有类的构造函数 我要验证的类有一个android依赖项,因此像reflections这样的库不能直接在lint模块中使用,这是一个java库 你能帮我满足我的要求吗?我试着解决了你的问题。我已经检查了注释中的值和使用的参数是否相等。您可以调整代码以满足您的需求。下面是一个示例检测器类,其中我使用注释提供了解释。你可以改进它 类InvalidConstruct

好的,我甚至成功地将lint应用于每个类的单个构造函数

然而,我想验证数百个类,它们都继承了一个公共接口

因此,我想验证继承我指定的接口的所有类的构造函数

我要验证的类有一个android依赖项,因此像reflections这样的库不能直接在lint模块中使用,这是一个java库


你能帮我满足我的要求吗?

我试着解决了你的问题。我已经检查了注释中的值和使用的参数是否相等。您可以调整代码以满足您的需求。下面是一个示例
检测器
类,其中我使用注释提供了解释。你可以改进它

类InvalidConstructorCallDetector:Detector(),Detector.UastScanner{
//检查呼叫表达式
重写fun GetApplicatableUASTYPES()=listOf(ucalExpression::class.java)
重写createUastHandler(上下文:JavaContext)=对象:UElementHandler(){
重写visitCallExpression(节点:UCallExpression){
//检查调用是否为构造函数调用,以及引用的类是否继承您的接口
if(node.isConstructorCall()&&
context.doesInherit(节点“com.example.android.YourInterface”)
) {
val constructor=node.resolve()!!
//获取第一个参数。您可以使用循环检查所有参数或任何您需要的参数
val param=constructor.parameterList.parameters[0]
//获取您的注释
val参数注释=
param.getAnnotation(“com.example.android.youranotation”)!!
//获取在构造函数声明的注释中指定的值
val attributeValue=paramAnnotation.findAttributeValue(“值”)!!.text.toInt()
//获取用于第一个参数的参数。同样,您可以在循环中使用该参数并使用索引
val argumentValue=node.getArgumentForParameter(0)!!.evaluate().toString().toInt()
if(attributeValue!=argumentValue)//检查是否相等。执行任何需要的检查
{
上下文报告(
问题
节点,
context.getNameLocation(节点),
“参数值($argumentValue)无效。有效参数:$attributeValue”
)
}
}
}
}
//检查构造函数调用引用的类是否实现了接口
私有fun JavaContext.doesInherit(节点:ucalExpression,类型名称:String):布尔值{
对于(键入node.classReference!!.getExpressionType()!!.superTypes){
if(evaluator.typeMatches(type,typeName))返回true
}
返回错误
}
伴星{
val ISSUE=ISSUE.create(
“无效构造函数调用”,
“构造函数调用中的参数无效”,
“只允许在构造函数声明的注释中定义值”,
类别.正确性,
10,
严重性。错误,
实施(
InvalidConstructorCallDetector::class.java,
EnumSet.of(Scope.JAVA_文件)
)
)
}
}

我试着解决了你的问题。我已经检查了注释中的值和使用的参数是否相等。您可以调整代码以满足您的需求。下面是一个示例
检测器
类,其中我使用注释提供了解释。你可以改进它

类InvalidConstructorCallDetector:Detector(),Detector.UastScanner{
//检查呼叫表达式
重写fun GetApplicatableUASTYPES()=listOf(ucalExpression::class.java)
重写createUastHandler(上下文:JavaContext)=对象:UElementHandler(){
重写visitCallExpression(节点:UCallExpression){
//检查调用是否为构造函数调用,以及引用的类是否继承您的接口
if(node.isConstructorCall()&&
context.doesInherit(节点“com.example.android.YourInterface”)
) {
val constructor=node.resolve()!!
//获取第一个参数。您可以使用循环检查所有参数或任何您需要的参数
val param=constructor.parameterList.parameters[0]
//获取您的注释
val参数注释=
param.getAnnotation(“com.example.android.youranotation”)!!
//获取在构造函数声明的注释中指定的值
val attributeValue=paramAnnotation.findAttributeValue(“值”)!!.text.toInt()
//获取用于第一个参数的参数。同样,您可以在循环中使用该参数并使用索引
val argumentValue=node.getArgumentForParameter(0)!!.evaluate().toString().toInt()
if(attributeValue!=argumentValue)//检查是否相等。执行任何需要的检查
{
上下文报告(
问题
节点,
context.getNameLocation(节点),
“参数值($argumentValue)无效。有效参数:$attributeValue”
)
}
}
}
}
//切
class SomeDetector : Detector(), SourceCodeScanner {
    
    
    override fun getApplicableConstructorTypes(): List<String>? {
        return listOf(PARENT_CLASS)
    }

    override fun visitConstructor(context: JavaContext, node: UCallExpression, constructor: PsiMethod) {
        // blabla...
    }
}