From f6879c322fc142eb3ae797c848e49c376347ca61 Mon Sep 17 00:00:00 2001 From: Stuart Kent Date: Tue, 10 Jan 2023 17:04:05 -0500 Subject: [PATCH] Fix check for lint 30.4.0 When I run this lint check using AGP 7.4.0-rc01, I see the following output in the lint report: Unexpected failure during lint analysis of EditTextExtensions.kt (this is a bug in lint or one of the libraries it depends on) Message: class com.youneedabudget.lintchecks.SerializableObjectMissingReadResolveDetector$createUastHandler$1 tried to access protected method 'org.jetbrains.kotlin.psi.KtClassOrObject org.jetbrains.uast.kotlin.KotlinUClass.getKtClass() The problem appears to be the use of KotlinUClass::ktClass. The same error appears for a check packaged in androidx.fragment (https://issuetracker.google.com/issues/237567009), which was fixed here: https://github.com/androidx/androidx/commit/528b64f0631f7ec4db6325c5ed15c4b897406e32 This commit ports the same fix to SerializableObjectMissingReadResolveDetector, as best as I could tell. (The tests all still passed for me!) --- ...lizableObjectMissingReadResolveDetector.kt | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/lint/src/main/java/com/stylingandroid/readresolve/lint/SerializableObjectMissingReadResolveDetector.kt b/lint/src/main/java/com/stylingandroid/readresolve/lint/SerializableObjectMissingReadResolveDetector.kt index 6795e19..c25e74a 100644 --- a/lint/src/main/java/com/stylingandroid/readresolve/lint/SerializableObjectMissingReadResolveDetector.kt +++ b/lint/src/main/java/com/stylingandroid/readresolve/lint/SerializableObjectMissingReadResolveDetector.kt @@ -12,11 +12,15 @@ import com.android.tools.lint.detector.api.Severity import com.intellij.psi.PsiElement import java.io.Serializable import java.util.EnumSet +import org.jetbrains.kotlin.psi.KtClassBody +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtObjectDeclaration +import org.jetbrains.kotlin.psi.psiUtil.allChildren import org.jetbrains.uast.UClass import org.jetbrains.uast.UElement -import org.jetbrains.uast.kotlin.KotlinUClass -import org.jetbrains.uast.kotlin.declarations.KotlinUMethod +import org.jetbrains.uast.kotlin.KotlinUMethod + @Suppress("UnstableApiUsage") internal class SerializableObjectMissingReadResolveDetector : Detector(), Detector.UastScanner { @@ -63,18 +67,19 @@ internal class SerializableObjectMissingReadResolveDetector : Detector(), Detect object : UElementHandler() { override fun visitClass(node: UClass) { + val sourcePsi = node.sourcePsi + if ( - node is KotlinUClass && - node.ktClass is KtObjectDeclaration && + sourcePsi is KtObjectDeclaration && isSerializable(node) ) { - if (node.doesNotHaveReadResolveMethod()) { + if (sourcePsi.doesNotHaveReadResolveMethod()) { context.report( MISSING_READ_RESOLVE_ISSUE, node, context.getLocation(node as PsiElement), MISSING_READ_RESOLVE_ISSUE_EXPLANATION, - node.createMissingReadResolveLintFix() + sourcePsi.createMissingReadResolveLintFix() ) } else { node.methods @@ -105,14 +110,20 @@ internal class SerializableObjectMissingReadResolveDetector : Detector(), Detect false ) - fun KotlinUClass.doesNotHaveReadResolveMethod(): Boolean = - allMethods.none { it.name == "readResolve" } + fun KtObjectDeclaration.doesNotHaveReadResolveMethod(): Boolean { + return allChildren + .find { it is KtClassBody } + ?.children + ?.filterIsInstance() + ?.none { it.name == "readResolve" } + ?: true + } fun KotlinUMethod.hasCorrectReadResolveSignature(): Boolean = returnType?.canonicalText == JAVA_OBJECT && parameters.isEmpty() - fun KotlinUClass.createMissingReadResolveLintFix(): LintFix { - val objectSource = sourceElement.text + fun KtObjectDeclaration.createMissingReadResolveLintFix(): LintFix { + val objectSource = text val hasClassBody = objectSource.trimEnd().endsWith("}") return if (hasClassBody) { LintFix.create()