首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“何时条件”检查的自定义衬里规则

“何时条件”检查的自定义衬里规则
EN

Stack Overflow用户
提问于 2019-05-08 08:06:13
回答 1查看 528关注 0票数 4

我使用Gson的序列化适配器RuntimeTypeAdapterFactory来序列化基于弟子的数据。但是,当有一个未解析的鉴别器(来自API)而没有在客户端上定义时,TypeAdapter将为空。

在这种情况下,如果我有一个kotlin当条件检查为:

代码语言:javascript
复制
when(fooType){
 is fooA -> //blaba
 is fooB -> //blaba
 //else or null is not handled
}

fooTypenull,当null条件不被处理时,它会崩溃。是否有任何方法可以创建自定义林特规则(检测器),以便在条件(java中的实例)实现elsenull检查并将其注入Android检查时检查

EN

回答 1

Stack Overflow用户

发布于 2019-05-08 13:05:51

我确实没有编写自定义皮棉检查的经验,但我认为这样的东西(虽然这不是最优的,而且您的不应该使用它,因为它只显示了它的想法)可能会奏效。

代码语言:javascript
复制
class WhenNullElseMissingDetector : Detector(), Detector.UastScanner {

    override fun getApplicableUastTypes(): MutableList<Class<out UElement>> =
        mutableListOf(USwitchExpression::class.java)

    override fun createUastHandler(context: JavaContext): UElementHandler = WhenNullElseMissingHandler(context)
}

class WhenNullElseMissingHandler(private val context: JavaContext) : UElementHandler() {

    override fun visitSwitchExpression(node: USwitchExpression) {
        if (node.psi?.javaClass != KtWhenExpression::class.java) {
            // returning early here, so it doesn't go false positive on java switches
            return
        }

        var hasNullClause = false
        var hasElseClause = false

        node.body.expressions.forEach { clause ->
             // checking the child's text here just for a example, you should
             // probably check if child's class is KtWhenConditionIsPattern,
             // KtWhenConditionWithExpression or LeafPsiElement
            val clauseText = clause.psi?.firstChild?.text

            if ("null" == clauseText) {
                hasNullClause = true
            } else if ("else" == clauseText) {
                hasElseClause = true
            }
        }

        if (!hasElseClause) {
            context.report(
                WHEN_NULL_OR_ELSE_MISSING, node, context.getLocation(node),
                "When expression must include an else case"
            )
        }

        if (!hasNullClause) {
            context.report(
                WHEN_NULL_OR_ELSE_MISSING, node, context.getLocation(node),
                "When expression must include a null case"
            )
        }
    }
}

当然,您必须将新的检测器添加到IssueRegistry中。假设您在一个单独的java/kotlin模块中检查了您的lint,它可能如下所示

代码语言:javascript
复制
package com.example.lintchecks

// omit imports

val WHEN_NULL_OR_ELSE_MISSING = Issue.create(
    "MY_ISSUE_ID",
    "A brief to show in a one line popup",
    "More detailed explanation",
    Category.CORRECTNESS,
    5,
    Severity.WARNING,
    Implementation(
        WhenNullElseMissingDetector::class.java,
        Scope.JAVA_FILE_SCOPE
    )
)

class MyIssueRegistry : IssueRegistry() {
    override val issues: List<Issue>
        get() = listOf(WHEN_NULL_OR_ELSE_MISSING)

}

库模块的build.gradle文件应该具有com.android.tools.lint:lint-api:26.4.0 (或与其相关的任何版本) compileOnly依赖项和如下所示的块

代码语言:javascript
复制
jar {
    manifest {
        attributes("Lint-Registry-v2": "com.example.lintchecks.MyIssueRegistry")
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56036182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档