import com.android.tools.lint.detector.api.Detector import com.android.tools.lint.detector.api.Implementation import com.android.tools.lint.detector.api.Issue import com.android.tools.lint.detector.api.JavaContext import com.android.tools.lint.detector.api.Scope import com.android.tools.lint.detector.api.Severity import com.android.tools.lint.detector.api.SourceCodeScanner import org.jetbrains.uast.UClass private const val KxSerializable = "kotlinx.serialization.Serializable" class SerializableNavigationKey : Detector(), SourceCodeScanner { override fun applicableSuperClasses() = listOf("com.example.NavigationKey") // replace with yours override fun visitClass(context: JavaContext, declaration: UClass) { if (declaration.isInterface) return if (context.evaluator.isAbstract(declaration)) return if (context.evaluator.getAnnotation(declaration, KxSerializable) == null) { context.report( issue = ISSUE, scopeClass = declaration, location = context.getNameLocation(declaration), message = "NavigationKey implementations must be annotated with @Serializable.", quickfixData = fix() .name("Add @Serializable annotation") .annotate(KxSerializable, context, declaration) .autoFix() .build() // check if kxs is on the classpath .takeIf { context.evaluator.findClass(KxSerializable) != null }, ) } } companion object { @JvmField val ISSUE = Issue.create( id = "SerializableNavigationKey", briefDescription = "Subclasses of NavigationKey MUST be serializable", explanation = """ Navigation key types used with Superapp Navigation MUST implement kotlinx.serialization.Serializable. This is required for proper backstack management, including state saving and restoration. """, priority = 10, severity = Severity.ERROR, implementation = Implementation(SerializableNavigationKey::class.java, Scope.JAVA_FILE_SCOPE), ) } }