為さねば成らぬ

retia.verno@gmail.com

[Android] Android LintのDetectorを読む Day4: AppCompatCallDetector

ソースコード

https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/AppCompatCallDetector.java

背景

AppCompatのメソッドを使う時、 通常のものではなく support のものを使うこと。 ちなみに現在SupportLibraryはAndroidXに役割を渡しており新しい開発についてもそちらで行われる。

なおAndroidXのLintについて、actionaBarは

https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/app/SetActionBarDetector.kt

でチェックしている。

気づき

LintFixする

自動でlintが修正したい場合には、 LintFix を用いる。

                String message =
                        String.format("Should use `%1$s` instead of `%2$s` name", replace, name);
                LintFix fix =
                        fix().name("Replace with " + replace + "()")
                                .replace()
                                .text(name)
                                .with(replace)
                                .build();
                context.report(ISSUE, node, context.getLocation(node), message, fix);

メソッドが特定のクラスのサブクラスににあることを判定

isMemberInSubClassOf の第3引数のbooleanは、厳密にサブクラスかを判定している。 この場合 false のため、サブクラスではないその特定のクラスにメソッドが生えていてもtrueになる。

override fun visitMethodCall(context: JavaContext, node: UCallExpression, method:PsiMethod){
    val answer = context.getEvaluator().isMemberInSubClassOf(method, CLASS, false)
}