From c603bb3853d0f184366e57eeaddfc1f5d9867ce8 Mon Sep 17 00:00:00 2001 From: nicholasdoglio Date: Sun, 21 Apr 2024 19:50:47 -0400 Subject: [PATCH] Make ComponentMustBeAbstractDetector aware of Anvil Component annotations --- .../java/dev/whosnickdoglio/stubs/Anvil.kt} | 2 +- .../stubs/{DaggerStubs.kt => Dagger.kt} | 0 ...ributesBindingMustHaveSuperDetectorTest.kt | 1 + .../MissingContributesBindingDetectorTest.kt | 1 + .../MissingContributesToDetectorTest.kt | 1 + .../detectors/NoAnvilInJavaDetectorTest.kt | 1 + .../ComponentMustBeAbstractDetector.kt | 15 ++++++++++- .../ComponentMustBeAbstractDetectorTest.kt | 25 ++++++++++++++----- 8 files changed, 38 insertions(+), 8 deletions(-) rename lint/{anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/Stubs.kt => annotation-constants/src/testFixtures/java/dev/whosnickdoglio/stubs/Anvil.kt} (95%) rename lint/annotation-constants/src/testFixtures/java/dev/whosnickdoglio/stubs/{DaggerStubs.kt => Dagger.kt} (100%) diff --git a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/Stubs.kt b/lint/annotation-constants/src/testFixtures/java/dev/whosnickdoglio/stubs/Anvil.kt similarity index 95% rename from lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/Stubs.kt rename to lint/annotation-constants/src/testFixtures/java/dev/whosnickdoglio/stubs/Anvil.kt index a71dc835..887e715e 100644 --- a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/Stubs.kt +++ b/lint/annotation-constants/src/testFixtures/java/dev/whosnickdoglio/stubs/Anvil.kt @@ -2,7 +2,7 @@ * Copyright (C) 2024 Nicholas Doglio * SPDX-License-Identifier: MIT */ -package dev.whosnickdoglio.anvil.detectors +package dev.whosnickdoglio.stubs import com.android.tools.lint.checks.infrastructure.TestFile import com.android.tools.lint.checks.infrastructure.TestFiles diff --git a/lint/annotation-constants/src/testFixtures/java/dev/whosnickdoglio/stubs/DaggerStubs.kt b/lint/annotation-constants/src/testFixtures/java/dev/whosnickdoglio/stubs/Dagger.kt similarity index 100% rename from lint/annotation-constants/src/testFixtures/java/dev/whosnickdoglio/stubs/DaggerStubs.kt rename to lint/annotation-constants/src/testFixtures/java/dev/whosnickdoglio/stubs/Dagger.kt diff --git a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/ContributesBindingMustHaveSuperDetectorTest.kt b/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/ContributesBindingMustHaveSuperDetectorTest.kt index 89c67bdf..5d6312bc 100644 --- a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/ContributesBindingMustHaveSuperDetectorTest.kt +++ b/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/ContributesBindingMustHaveSuperDetectorTest.kt @@ -11,6 +11,7 @@ import com.google.testing.junit.testparameterinjector.TestParameterInjector import dev.whosnickdoglio.lint.annotations.anvil.CONTRIBUTES_BINDING import dev.whosnickdoglio.lint.annotations.anvil.CONTRIBUTES_MULTI_BINDING import dev.whosnickdoglio.lint.annotations.anvil.CONTRIBUTES_TO +import dev.whosnickdoglio.stubs.anvilAnnotations import dev.whosnickdoglio.stubs.daggerAnnotations import dev.whosnickdoglio.stubs.javaxAnnotations import org.junit.Test diff --git a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/MissingContributesBindingDetectorTest.kt b/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/MissingContributesBindingDetectorTest.kt index 03f1f8ac..d67bef90 100644 --- a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/MissingContributesBindingDetectorTest.kt +++ b/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/MissingContributesBindingDetectorTest.kt @@ -10,6 +10,7 @@ import com.google.testing.junit.testparameterinjector.TestParameter import com.google.testing.junit.testparameterinjector.TestParameterInjector import dev.whosnickdoglio.lint.annotations.anvil.CONTRIBUTES_BINDING import dev.whosnickdoglio.lint.annotations.anvil.CONTRIBUTES_MULTI_BINDING +import dev.whosnickdoglio.stubs.anvilAnnotations import dev.whosnickdoglio.stubs.javaxAnnotations import org.junit.Test import org.junit.runner.RunWith diff --git a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/MissingContributesToDetectorTest.kt b/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/MissingContributesToDetectorTest.kt index e342b8c0..bf0a1917 100644 --- a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/MissingContributesToDetectorTest.kt +++ b/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/MissingContributesToDetectorTest.kt @@ -6,6 +6,7 @@ package dev.whosnickdoglio.anvil.detectors import com.android.tools.lint.checks.infrastructure.TestFiles import com.android.tools.lint.checks.infrastructure.TestLintTask +import dev.whosnickdoglio.stubs.anvilAnnotations import dev.whosnickdoglio.stubs.daggerAnnotations import org.junit.Test diff --git a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/NoAnvilInJavaDetectorTest.kt b/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/NoAnvilInJavaDetectorTest.kt index fc381f3e..ebe364d1 100644 --- a/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/NoAnvilInJavaDetectorTest.kt +++ b/lint/anvil/src/test/java/dev/whosnickdoglio/anvil/detectors/NoAnvilInJavaDetectorTest.kt @@ -15,6 +15,7 @@ import dev.whosnickdoglio.lint.annotations.anvil.CONTRIBUTES_SUBCOMPONENT_FACTOR import dev.whosnickdoglio.lint.annotations.anvil.CONTRIBUTES_TO import dev.whosnickdoglio.lint.annotations.anvil.MERGE_COMPONENT import dev.whosnickdoglio.lint.annotations.anvil.MERGE_SUBCOMPONENT +import dev.whosnickdoglio.stubs.anvilAnnotations import org.junit.Test import org.junit.runner.RunWith diff --git a/lint/dagger/src/main/java/dev/whosnickdoglio/dagger/detectors/ComponentMustBeAbstractDetector.kt b/lint/dagger/src/main/java/dev/whosnickdoglio/dagger/detectors/ComponentMustBeAbstractDetector.kt index bde93d28..7a249afb 100644 --- a/lint/dagger/src/main/java/dev/whosnickdoglio/dagger/detectors/ComponentMustBeAbstractDetector.kt +++ b/lint/dagger/src/main/java/dev/whosnickdoglio/dagger/detectors/ComponentMustBeAbstractDetector.kt @@ -15,6 +15,9 @@ 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 com.android.tools.lint.detector.api.TextFormat +import dev.whosnickdoglio.lint.annotations.anvil.CONTRIBUTES_SUBCOMPONENT +import dev.whosnickdoglio.lint.annotations.anvil.MERGE_COMPONENT +import dev.whosnickdoglio.lint.annotations.anvil.MERGE_SUBCOMPONENT import dev.whosnickdoglio.lint.annotations.dagger.COMPONENT import dev.whosnickdoglio.lint.annotations.dagger.SUBCOMPONENT import org.jetbrains.uast.UAnnotation @@ -34,7 +37,7 @@ internal class ComponentMustBeAbstractDetector : override fun createUastHandler(context: JavaContext): UElementHandler = object : UElementHandler() { override fun visitAnnotation(node: UAnnotation) { - if (node.qualifiedName == COMPONENT || node.qualifiedName == SUBCOMPONENT) { + if (node.qualifiedName in componentAnnotations) { val component = node.uastParent as? UClass ?: return if (!context.evaluator.isAbstract(component)) { @@ -62,6 +65,16 @@ internal class ComponentMustBeAbstractDetector : private val implementation = Implementation(ComponentMustBeAbstractDetector::class.java, Scope.JAVA_FILE_SCOPE) + internal val componentAnnotations = setOf( + // Vanilla Dagger + COMPONENT, + SUBCOMPONENT, + // Anvil + MERGE_COMPONENT, + MERGE_SUBCOMPONENT, + CONTRIBUTES_SUBCOMPONENT, + ) + internal val ISSUE = Issue.create( id = "ComponentMustBeAbstract", diff --git a/lint/dagger/src/test/java/dev/whosnickdoglio/dagger/detectors/ComponentMustBeAbstractDetectorTest.kt b/lint/dagger/src/test/java/dev/whosnickdoglio/dagger/detectors/ComponentMustBeAbstractDetectorTest.kt index aa9c685a..f91662d4 100644 --- a/lint/dagger/src/test/java/dev/whosnickdoglio/dagger/detectors/ComponentMustBeAbstractDetectorTest.kt +++ b/lint/dagger/src/test/java/dev/whosnickdoglio/dagger/detectors/ComponentMustBeAbstractDetectorTest.kt @@ -8,15 +8,20 @@ import com.android.tools.lint.checks.infrastructure.TestFiles import com.android.tools.lint.checks.infrastructure.TestLintTask import com.google.testing.junit.testparameterinjector.TestParameter import com.google.testing.junit.testparameterinjector.TestParameterInjector -import dev.whosnickdoglio.lint.annotations.dagger.COMPONENT -import dev.whosnickdoglio.lint.annotations.dagger.SUBCOMPONENT +import com.google.testing.junit.testparameterinjector.TestParameterValuesProvider +import dev.whosnickdoglio.stubs.anvilAnnotations import dev.whosnickdoglio.stubs.daggerAnnotations import org.junit.Test import org.junit.runner.RunWith @RunWith(TestParameterInjector::class) class ComponentMustBeAbstractDetectorTest { - @TestParameter(value = [COMPONENT, SUBCOMPONENT]) + private class ComponentMustBeAbstractTestParameterValueProvider : TestParameterValuesProvider() { + override fun provideValues(context: Context?): List<*> = + ComponentMustBeAbstractDetector.componentAnnotations.toList() + } + + @TestParameter(valuesProvider = ComponentMustBeAbstractTestParameterValueProvider::class) lateinit var componentAnnotation: String @Test @@ -24,6 +29,7 @@ class ComponentMustBeAbstractDetectorTest { TestLintTask.lint() .files( daggerAnnotations, + anvilAnnotations, TestFiles.kotlin( """ import $componentAnnotation @@ -40,10 +46,11 @@ class ComponentMustBeAbstractDetectorTest { } @Test - fun `java kotlin abstract class component does not show error`() { + fun `java abstract class component does not show error`() { TestLintTask.lint() .files( daggerAnnotations, + anvilAnnotations, TestFiles.java( """ import $componentAnnotation; @@ -64,6 +71,7 @@ class ComponentMustBeAbstractDetectorTest { TestLintTask.lint() .files( daggerAnnotations, + anvilAnnotations, TestFiles.kotlin( """ import $componentAnnotation @@ -84,6 +92,7 @@ class ComponentMustBeAbstractDetectorTest { TestLintTask.lint() .files( daggerAnnotations, + anvilAnnotations, TestFiles.java( """ import $componentAnnotation; @@ -104,6 +113,7 @@ class ComponentMustBeAbstractDetectorTest { TestLintTask.lint() .files( daggerAnnotations, + anvilAnnotations, TestFiles.java( """ import $componentAnnotation; @@ -134,7 +144,8 @@ class ComponentMustBeAbstractDetectorTest { @@ -4 +4 - class MyComponent {} + interface MyComponent {} - """.trimIndent(), + """ + .trimIndent(), ) } @@ -143,6 +154,7 @@ class ComponentMustBeAbstractDetectorTest { TestLintTask.lint() .files( daggerAnnotations, + anvilAnnotations, TestFiles.kotlin( """ import $componentAnnotation @@ -173,7 +185,8 @@ class ComponentMustBeAbstractDetectorTest { @@ -4 +4 - class MyComponent + interface MyComponent - """.trimIndent(), + """ + .trimIndent(), ) } }