From 0cd22cdd04e8967ffb124beb0e7cfb645701b1de Mon Sep 17 00:00:00 2001 From: Shaishav Gandhi Date: Tue, 11 Dec 2018 23:35:34 -0800 Subject: [PATCH 1/3] Add overrideScopes flag to lint check --- .../autodispose/lint/AutoDisposeDetector.kt | 12 ++++- .../lint/AutoDisposeDetectorTest.kt | 51 +++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/static-analysis/autodispose-lint/src/main/kotlin/com/uber/autodispose/lint/AutoDisposeDetector.kt b/static-analysis/autodispose-lint/src/main/kotlin/com/uber/autodispose/lint/AutoDisposeDetector.kt index 764d1708c..2ec7940ff 100644 --- a/static-analysis/autodispose-lint/src/main/kotlin/com/uber/autodispose/lint/AutoDisposeDetector.kt +++ b/static-analysis/autodispose-lint/src/main/kotlin/com/uber/autodispose/lint/AutoDisposeDetector.kt @@ -48,6 +48,7 @@ import java.util.EnumSet internal const val CUSTOM_SCOPE_KEY = "autodispose.typesWithScope" internal const val LENIENT = "autodispose.lenient" +internal const val OVERRIDE_SCOPES = "autodispose.overrideScopes" /** * Detector which checks if your stream subscriptions are handled by AutoDispose. @@ -107,8 +108,8 @@ class AutoDisposeDetector: Detector(), SourceCodeScanner { private var lenient: Boolean = false override fun beforeCheckRootProject(context: Context) { - // Add the default Android scopes. - val scopes = HashSet(DEFAULT_SCOPES) + var overrideScopes = false + val scopes = HashSet() // Add the custom scopes defined in configuration. val props = Properties() @@ -126,6 +127,13 @@ class AutoDisposeDetector: Detector(), SourceCodeScanner { props.getProperty(LENIENT)?.toBoolean()?.let { lenient = it } + props.getProperty(OVERRIDE_SCOPES)?.toBoolean()?.let { + overrideScopes = it + } + } + // If scopes are not overriden, add the default ones. + if (!overrideScopes) { + scopes.addAll(DEFAULT_SCOPES) } appliedScopes = scopes } diff --git a/static-analysis/autodispose-lint/src/test/kotlin/com/uber/autodispose/lint/AutoDisposeDetectorTest.kt b/static-analysis/autodispose-lint/src/test/kotlin/com/uber/autodispose/lint/AutoDisposeDetectorTest.kt index 7f0ebf109..ff08e3402 100644 --- a/static-analysis/autodispose-lint/src/test/kotlin/com/uber/autodispose/lint/AutoDisposeDetectorTest.kt +++ b/static-analysis/autodispose-lint/src/test/kotlin/com/uber/autodispose/lint/AutoDisposeDetectorTest.kt @@ -530,6 +530,57 @@ class AutoDisposeDetectorTest { .expectClean() } + @Test fun overrideCustomScopeWithoutAutoDispose() { + val properties = projectProperties() + properties.property(CUSTOM_SCOPE_KEY, "com.uber.autodispose.sample.ClassWithCustomScope") + properties.property(OVERRIDE_SCOPES, "true") + properties.to(AutoDisposeDetector.PROPERTY_FILE) + + lint().files(rxJava2(), LIFECYCLE_OWNER, ACTIVITY, properties, kotlin(""" + package com.uber.autodispose.sample + import com.uber.autodispose.sample.ClassWithCustomScope + import androidx.appcompat.app.AppCompatActivity + import io.reactivex.Observable + import com.uber.autodispose.ScopeProvider + + class MyCustomClass: AppCompatActivity { + lateinit var scopeProvider: ScopeProvider + fun doSomething() { + val observable = Observable.just(1, 2, 3) + observable.subscribe() // No error since the scopes are being overriden and only custom ones are considered. + } + } + """).indented()) + .issues(AutoDisposeDetector.ISSUE) + .run() + .expectClean() + } + + @Test fun overrideCustomScopeWithAutoDispose() { + val properties = projectProperties() + properties.property(CUSTOM_SCOPE_KEY, "com.uber.autodispose.sample.ClassWithCustomScope") + properties.property(OVERRIDE_SCOPES, "true") + properties.to(AutoDisposeDetector.PROPERTY_FILE) + + lint().files(rxJava2(), CUSTOM_SCOPE, properties, kotlin(""" + package com.uber.autodispose.sample + import com.uber.autodispose.sample.ClassWithCustomScope + import io.reactivex.Observable + import com.uber.autodispose.ScopeProvider + + class MyCustomClass: ClassWithCustomScope { + lateinit var scopeProvider: ScopeProvider + fun doSomething() { + val observable = Observable.just(1, 2, 3) + observable.autoDisposable(scopeProvider).subscribe() + } + } + """).indented()) + .issues(AutoDisposeDetector.ISSUE) + .run() + .expectClean() + } + @Test fun capturedDisposable() { val propertiesFile = lenientPropertiesFile() lint().files(rxJava2(), propertiesFile, LIFECYCLE_OWNER, ACTIVITY, kotlin(""" From d476f27e99b04f6d1fe8b4c782914292811689a6 Mon Sep 17 00:00:00 2001 From: Shaishav Gandhi Date: Tue, 11 Dec 2018 23:53:49 -0800 Subject: [PATCH 2/3] Change HashSet invocation to more Kotlin idiomatic code --- .../kotlin/com/uber/autodispose/lint/AutoDisposeDetector.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static-analysis/autodispose-lint/src/main/kotlin/com/uber/autodispose/lint/AutoDisposeDetector.kt b/static-analysis/autodispose-lint/src/main/kotlin/com/uber/autodispose/lint/AutoDisposeDetector.kt index 2ec7940ff..89a1bcc38 100644 --- a/static-analysis/autodispose-lint/src/main/kotlin/com/uber/autodispose/lint/AutoDisposeDetector.kt +++ b/static-analysis/autodispose-lint/src/main/kotlin/com/uber/autodispose/lint/AutoDisposeDetector.kt @@ -109,7 +109,7 @@ class AutoDisposeDetector: Detector(), SourceCodeScanner { override fun beforeCheckRootProject(context: Context) { var overrideScopes = false - val scopes = HashSet() + val scopes = mutableSetOf() // Add the custom scopes defined in configuration. val props = Properties() From 3c42327dcf482d18b76ed02b31e491fcf282fa52 Mon Sep 17 00:00:00 2001 From: Shaishav Gandhi Date: Tue, 11 Dec 2018 23:54:34 -0800 Subject: [PATCH 3/3] Reformat method invocation --- .../uber/autodispose/lint/AutoDisposeDetectorTest.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/static-analysis/autodispose-lint/src/test/kotlin/com/uber/autodispose/lint/AutoDisposeDetectorTest.kt b/static-analysis/autodispose-lint/src/test/kotlin/com/uber/autodispose/lint/AutoDisposeDetectorTest.kt index ff08e3402..2756ae165 100644 --- a/static-analysis/autodispose-lint/src/test/kotlin/com/uber/autodispose/lint/AutoDisposeDetectorTest.kt +++ b/static-analysis/autodispose-lint/src/test/kotlin/com/uber/autodispose/lint/AutoDisposeDetectorTest.kt @@ -536,7 +536,11 @@ class AutoDisposeDetectorTest { properties.property(OVERRIDE_SCOPES, "true") properties.to(AutoDisposeDetector.PROPERTY_FILE) - lint().files(rxJava2(), LIFECYCLE_OWNER, ACTIVITY, properties, kotlin(""" + lint().files(rxJava2(), + LIFECYCLE_OWNER, + ACTIVITY, + properties, + kotlin(""" package com.uber.autodispose.sample import com.uber.autodispose.sample.ClassWithCustomScope import androidx.appcompat.app.AppCompatActivity @@ -562,7 +566,10 @@ class AutoDisposeDetectorTest { properties.property(OVERRIDE_SCOPES, "true") properties.to(AutoDisposeDetector.PROPERTY_FILE) - lint().files(rxJava2(), CUSTOM_SCOPE, properties, kotlin(""" + lint().files(rxJava2(), + CUSTOM_SCOPE, + properties, + kotlin(""" package com.uber.autodispose.sample import com.uber.autodispose.sample.ClassWithCustomScope import io.reactivex.Observable