diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullable.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullable.kt index ebc8bb2d5554..18ca368dae4e 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullable.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullable.kt @@ -9,6 +9,7 @@ import io.gitlab.arturbosch.detekt.api.Issue import io.gitlab.arturbosch.detekt.api.Rule import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution +import io.gitlab.arturbosch.detekt.rules.isAbstract import io.gitlab.arturbosch.detekt.rules.isNonNullCheck import io.gitlab.arturbosch.detekt.rules.isNullCheck import io.gitlab.arturbosch.detekt.rules.isOpen @@ -474,7 +475,7 @@ class CanBeNonNullable(config: Config = Config.empty) : Rule(config) { } private fun KtProperty.isCandidate(): Boolean { - if (isOpen()) return false + if (isOpen() || isAbstract()) return false val isSetToNonNullable = initializer?.isNullableType() != true && getter?.isNullableType() != true && delegate?.returnsNullable() != true diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullableSpec.kt b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullableSpec.kt index 68b0faebd702..1224b2a88902 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullableSpec.kt +++ b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/CanBeNonNullableSpec.kt @@ -377,7 +377,7 @@ class CanBeNonNullableSpec(val env: KotlinCoreEnvironment) { @Test fun `does not report open properties`() { val code = """ - abstract class A { + open class A { open val a: Int? = 5 open var b: Int? = 5 } @@ -385,6 +385,17 @@ class CanBeNonNullableSpec(val env: KotlinCoreEnvironment) { assertThat(subject.compileAndLintWithContext(env, code)).isEmpty() } + @Test + fun `does not report abstract properties`() { + val code = """ + abstract class A { + abstract val a: Int? + abstract var b: Int? + } + """ + assertThat(subject.compileAndLintWithContext(env, code)).isEmpty() + } + @Test fun `does not report properties whose initial assignment derives from unsafe non-Java code`() { val code = """