| /* |
| * Copyright (C) 2020 The Dagger Authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package dagger.lint |
| |
| import com.android.tools.lint.checks.infrastructure.LintDetectorTest |
| import com.android.tools.lint.detector.api.Detector |
| import com.android.tools.lint.detector.api.Issue |
| import org.junit.Test |
| import org.junit.runner.RunWith |
| import org.junit.runners.JUnit4 |
| |
| @Suppress("UnstableApiUsage") |
| @RunWith(JUnit4::class) |
| class DaggerKotlinIssueDetectorTest : LintDetectorTest() { |
| |
| private companion object { |
| private val javaxInjectStubs = kotlin( |
| """ |
| package javax.inject |
| |
| annotation class Inject |
| annotation class Qualifier |
| """ |
| ).indented() |
| |
| private val daggerStubs = kotlin( |
| """ |
| package dagger |
| |
| annotation class Provides |
| annotation class Module |
| """ |
| ).indented() |
| |
| // For some reason in Bazel the stdlib dependency on the classpath isn't visible to the |
| // LintTestTask, so we just include it ourselves here for now. |
| private val jvmStaticStubs = kotlin( |
| """ |
| package kotlin.jvm |
| |
| annotation class JvmStatic |
| """ |
| ).indented() |
| } |
| |
| override fun getDetector(): Detector = DaggerKotlinIssueDetector() |
| |
| override fun getIssues(): List<Issue> = DaggerKotlinIssueDetector.issues |
| |
| @Test |
| fun simpleSmokeTestForQualifiersAndProviders() { |
| lint() |
| .allowMissingSdk() |
| .files( |
| javaxInjectStubs, |
| daggerStubs, |
| jvmStaticStubs, |
| kotlin( |
| """ |
| package foo |
| import javax.inject.Inject |
| import javax.inject.Qualifier |
| import kotlin.jvm.JvmStatic |
| import dagger.Provides |
| import dagger.Module |
| |
| @Qualifier |
| annotation class MyQualifier |
| |
| class InjectedTest { |
| // This should fail because of `:field` |
| @Inject |
| @field:MyQualifier |
| lateinit var prop: String |
| |
| // This is fine! |
| @Inject |
| @MyQualifier |
| lateinit var prop2: String |
| } |
| |
| @Module |
| object ObjectModule { |
| // This should fail because it uses `@JvmStatic` |
| @JvmStatic |
| @Provides |
| fun provideFoo(): String { |
| |
| } |
| |
| // This is fine! |
| @Provides |
| fun provideBar(): String { |
| |
| } |
| } |
| |
| @Module |
| class ClassModule { |
| companion object { |
| // This should fail because the companion object is part of ClassModule, so this is unnecessary. |
| @JvmStatic |
| @Provides |
| fun provideBaz(): String { |
| |
| } |
| } |
| } |
| |
| @Module |
| class ClassModuleQualified { |
| companion object { |
| // This should fail because the companion object is part of ClassModule, so this is unnecessary. |
| // This specifically tests a fully qualified annotation |
| @kotlin.jvm.JvmStatic |
| @Provides |
| fun provideBaz(): String { |
| |
| } |
| } |
| } |
| |
| @Module |
| class ClassModule2 { |
| // This should fail because the companion object is part of ClassModule |
| @Module |
| companion object { |
| @Provides |
| fun provideBaz(): String { |
| |
| } |
| } |
| } |
| |
| @Module |
| class ClassModule2Qualified { |
| // This should fail because the companion object is part of ClassModule |
| // This specifically tests a fully qualified annotation |
| @dagger.Module |
| companion object { |
| @Provides |
| fun provideBaz(): String { |
| |
| } |
| } |
| } |
| |
| // This is correct as of Dagger 2.26! |
| @Module |
| class ClassModule3 { |
| companion object { |
| @Provides |
| fun provideBaz(): String { |
| |
| } |
| } |
| } |
| |
| class ClassModule4 { |
| // This is should fail because this should be extracted to a standalone object. |
| @Module |
| companion object { |
| @Provides |
| fun provideBaz(): String { |
| |
| } |
| } |
| } |
| """ |
| ).indented() |
| ) |
| .allowCompilationErrors(false) |
| .run() |
| .expect( |
| """ |
| src/foo/MyQualifier.kt:14: Warning: Redundant 'field:' used for Dagger qualifier annotation. [FieldSiteTargetOnQualifierAnnotation] |
| @field:MyQualifier |
| ~~~~~~~~~~~~~~~~~~ |
| src/foo/MyQualifier.kt:26: Warning: @JvmStatic used for @Provides function in an object class [JvmStaticProvidesInObjectDetector] |
| @JvmStatic |
| ~~~~~~~~~~ |
| src/foo/MyQualifier.kt:43: Warning: @JvmStatic used for @Provides function in an object class [JvmStaticProvidesInObjectDetector] |
| @JvmStatic |
| ~~~~~~~~~~ |
| src/foo/MyQualifier.kt:56: Warning: @JvmStatic used for @Provides function in an object class [JvmStaticProvidesInObjectDetector] |
| @kotlin.jvm.JvmStatic |
| ~~~~~~~~~~~~~~~~~~~~~ |
| src/foo/MyQualifier.kt:66: Warning: Module companion objects should not be annotated with @Module. [ModuleCompanionObjects] |
| // This should fail because the companion object is part of ClassModule |
| ^ |
| src/foo/MyQualifier.kt:78: Warning: Module companion objects should not be annotated with @Module. [ModuleCompanionObjects] |
| // This should fail because the companion object is part of ClassModule |
| ^ |
| src/foo/MyQualifier.kt:101: Warning: Module companion objects should not be annotated with @Module. [ModuleCompanionObjects] |
| // This is should fail because this should be extracted to a standalone object. |
| ^ |
| 0 errors, 7 warnings |
| """.trimIndent() |
| ) |
| .expectFixDiffs( |
| """ |
| Fix for src/foo/MyQualifier.kt line 14: Remove 'field:': |
| @@ -14 +14 |
| - @field:MyQualifier |
| + @MyQualifier |
| Fix for src/foo/MyQualifier.kt line 26: Remove @JvmStatic: |
| @@ -26 +26 |
| - @JvmStatic |
| + |
| Fix for src/foo/MyQualifier.kt line 43: Remove @JvmStatic: |
| @@ -43 +43 |
| - @JvmStatic |
| + |
| Fix for src/foo/MyQualifier.kt line 56: Remove @JvmStatic: |
| @@ -56 +56 |
| - @kotlin.jvm.JvmStatic |
| + |
| Fix for src/foo/MyQualifier.kt line 66: Remove @Module: |
| @@ -67 +67 |
| - @Module |
| + |
| Fix for src/foo/MyQualifier.kt line 78: Remove @Module: |
| @@ -80 +80 |
| - @dagger.Module |
| + |
| Fix for src/foo/MyQualifier.kt line 101: Remove @Module: |
| @@ -102 +102 |
| - @Module |
| + |
| """.trimIndent() |
| ) |
| } |
| } |