You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
7.3 KiB
247 lines
7.3 KiB
/*
|
|
* 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()
|
|
)
|
|
}
|
|
}
|