From aa1b04b875a3cde9f7c03efcb842fdd479763ae4 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Sat, 16 Jul 2022 14:28:44 +0800 Subject: [PATCH 01/12] feat: UndocumentedPublicFunction supports protected functions refs #4633 --- .../UndocumentedPublicFunction.kt | 20 +++++++++------- .../UndocumentedPublicFunctionSpec.kt | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt index df1691573df..824cf5414d3 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt @@ -1,12 +1,9 @@ package io.gitlab.arturbosch.detekt.rules.documentation -import io.gitlab.arturbosch.detekt.api.CodeSmell -import io.gitlab.arturbosch.detekt.api.Config -import io.gitlab.arturbosch.detekt.api.Debt -import io.gitlab.arturbosch.detekt.api.Entity -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.* +import io.gitlab.arturbosch.detekt.api.internal.Configuration +import io.gitlab.arturbosch.detekt.rules.isOverride +import io.gitlab.arturbosch.detekt.rules.isProtected import io.gitlab.arturbosch.detekt.rules.isPublicNotOverridden import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtNamedFunction @@ -27,6 +24,9 @@ class UndocumentedPublicFunction(config: Config = Config.empty) : Rule(config) { Debt.TWENTY_MINS ) + @Configuration("if protected function should be searched") + private val searchProtectedFunction: Boolean by config(false) + override fun visitNamedFunction(function: KtNamedFunction) { if (function.funKeyword == null && function.isLocal) return @@ -42,5 +42,9 @@ class UndocumentedPublicFunction(config: Config = Config.empty) : Rule(config) { } private fun KtNamedFunction.shouldBeDocumented() = - parents.filterIsInstance().all { it.isPublic } && isPublicNotOverridden() + if (searchProtectedFunction) { + parents.filterIsInstance().all { it.isPublic || it.isProtected() } && (isPublic || isProtected()) && !isOverride() + } else { + parents.filterIsInstance().all { it.isPublic } && isPublicNotOverridden() + } } diff --git a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunctionSpec.kt b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunctionSpec.kt index 86d255fec6d..8f7076d90fb 100644 --- a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunctionSpec.kt +++ b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunctionSpec.kt @@ -1,10 +1,13 @@ package io.gitlab.arturbosch.detekt.rules.documentation +import io.gitlab.arturbosch.detekt.test.TestConfig import io.gitlab.arturbosch.detekt.test.compileAndLint import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test +private const val SEARCH_PROTECTED_FUN = "searchProtectedFunction" + class UndocumentedPublicFunctionSpec { val subject = UndocumentedPublicFunction() @@ -141,6 +144,27 @@ class UndocumentedPublicFunctionSpec { assertThat(subject.compileAndLint(code)).isEmpty() } + @Test + fun `does not report protected functions by default`() { + val code = """ + object Test { + protected fun noComment1() {} + } + """ + assertThat(subject.compileAndLint(code)).isEmpty() + } + + @Test + fun `reports protected functions if configured`() { + val code = """ + object Test { + protected fun noComment1() {} + } + """ + val subject = UndocumentedPublicFunction(TestConfig(mapOf(SEARCH_PROTECTED_FUN to "true"))) + assertThat(subject.compileAndLint(code)).hasSize(1) + } + @Nested inner class `nested class` { @Test From d8cf97e02961b5b12eda5550c1024267f7daf5d2 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Sat, 16 Jul 2022 14:44:39 +0800 Subject: [PATCH 02/12] feat: UndocumentedPublicProperty supports protected properties refs #4633 Signed-off-by: Kengo TODA --- .../arturbosch/detekt/rules/KtModifierList.kt | 8 +++++-- .../arturbosch/detekt/rules/Traversing.kt | 4 ++-- .../UndocumentedPublicFunction.kt | 7 +++--- .../UndocumentedPublicProperty.kt | 9 +++++-- .../UndocumentedPublicPropertySpec.kt | 24 +++++++++++++++++++ 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/KtModifierList.kt b/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/KtModifierList.kt index ea30d74838c..5e425dc7372 100644 --- a/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/KtModifierList.kt +++ b/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/KtModifierList.kt @@ -6,8 +6,12 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.psiUtil.isPublic -fun KtModifierListOwner.isPublicNotOverridden() = - isPublic && !isOverride() +fun KtModifierListOwner.isPublicNotOverridden(considerProtectedAsPublic: Boolean = false) = + if (considerProtectedAsPublic) { + isPublic || isProtected() + } else { + isPublic + } && !isOverride() fun KtModifierListOwner.isAbstract() = hasModifier(KtTokens.ABSTRACT_KEYWORD) diff --git a/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/Traversing.kt b/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/Traversing.kt index 5141bdc9697..842db32c935 100644 --- a/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/Traversing.kt +++ b/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/Traversing.kt @@ -20,10 +20,10 @@ inline fun KtElement.parentsOfTyp } } -fun KtNamedDeclaration.isPublicInherited(): Boolean { +fun KtNamedDeclaration.isPublicInherited(considerProtectedAsPublic: Boolean = false): Boolean { var classOrObject = containingClassOrObject while (classOrObject != null) { - if (!classOrObject.isPublic) { + if (!classOrObject.isPublic && !(considerProtectedAsPublic && classOrObject.isProtected())) { return false } classOrObject = classOrObject.containingClassOrObject diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt index 824cf5414d3..3d0fe6d9094 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt @@ -2,7 +2,6 @@ package io.gitlab.arturbosch.detekt.rules.documentation import io.gitlab.arturbosch.detekt.api.* import io.gitlab.arturbosch.detekt.api.internal.Configuration -import io.gitlab.arturbosch.detekt.rules.isOverride import io.gitlab.arturbosch.detekt.rules.isProtected import io.gitlab.arturbosch.detekt.rules.isPublicNotOverridden import org.jetbrains.kotlin.psi.KtClassOrObject @@ -43,8 +42,8 @@ class UndocumentedPublicFunction(config: Config = Config.empty) : Rule(config) { private fun KtNamedFunction.shouldBeDocumented() = if (searchProtectedFunction) { - parents.filterIsInstance().all { it.isPublic || it.isProtected() } && (isPublic || isProtected()) && !isOverride() + parents.filterIsInstance().all { it.isPublic || it.isProtected() } } else { - parents.filterIsInstance().all { it.isPublic } && isPublicNotOverridden() - } + parents.filterIsInstance().all { it.isPublic } + } && isPublicNotOverridden(searchProtectedFunction) } diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt index 361d8c8c638..a0e5a9950ac 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt @@ -1,5 +1,6 @@ package io.gitlab.arturbosch.detekt.rules.documentation +import io.gitlab.arturbosch.detekt.api.config import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.Debt @@ -7,6 +8,7 @@ import io.gitlab.arturbosch.detekt.api.Entity 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.Configuration import io.gitlab.arturbosch.detekt.rules.isPublicInherited import io.gitlab.arturbosch.detekt.rules.isPublicNotOverridden import org.jetbrains.kotlin.psi.KtNamedDeclaration @@ -31,6 +33,9 @@ class UndocumentedPublicProperty(config: Config = Config.empty) : Rule(config) { Debt.TWENTY_MINS ) + @Configuration("if protected function should be searched") + private val searchProtectedProperty: Boolean by config(false) + override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor) { if (constructor.isPublicInherited()) { val comment = constructor.containingClassOrObject?.docComment?.text @@ -43,7 +48,7 @@ class UndocumentedPublicProperty(config: Config = Config.empty) : Rule(config) { } override fun visitProperty(property: KtProperty) { - if (property.isPublicInherited() && !property.isLocal && property.shouldBeDocumented()) { + if (property.isPublicInherited(searchProtectedProperty) && !property.isLocal && property.shouldBeDocumented()) { report(property) } super.visitProperty(property) @@ -58,7 +63,7 @@ class UndocumentedPublicProperty(config: Config = Config.empty) : Rule(config) { } private fun KtProperty.shouldBeDocumented() = - docComment == null && isTopLevelOrInPublicClass() && isPublicNotOverridden() + docComment == null && isTopLevelOrInPublicClass() && isPublicNotOverridden(searchProtectedProperty) private fun KtProperty.isTopLevelOrInPublicClass() = isTopLevel || containingClassOrObject?.isPublic == true diff --git a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicPropertySpec.kt b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicPropertySpec.kt index 053ea6c6f90..be945b4cba4 100644 --- a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicPropertySpec.kt +++ b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicPropertySpec.kt @@ -1,10 +1,13 @@ package io.gitlab.arturbosch.detekt.rules.documentation +import io.gitlab.arturbosch.detekt.test.TestConfig import io.gitlab.arturbosch.detekt.test.compileAndLint import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test +private const val SEARCH_PROTECTED_PROPERTY = "searchProtectedProperty" + class UndocumentedPublicPropertySpec { val subject = UndocumentedPublicProperty() @@ -213,6 +216,27 @@ class UndocumentedPublicPropertySpec { assertThat(subject.compileAndLint(code)).isEmpty() } + @Test + fun `does not report undocumented protected properties by default`() { + val code = """ + object Test { + protected val a = 1 + } + """ + assertThat(subject.compileAndLint(code)).isEmpty() + } + + @Test + fun `reports undocumented protected properties if configured`() { + val code = """ + object Test { + protected val a = 1 + } + """ + val subject = UndocumentedPublicProperty(TestConfig(mapOf(SEARCH_PROTECTED_PROPERTY to "true"))) + assertThat(subject.compileAndLint(code)).hasSize(1) + } + @Nested inner class `public properties in nested classes` { From 29ca36044afb2c7e5c6a9e0f749212956a217e0a Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Sat, 16 Jul 2022 14:49:42 +0800 Subject: [PATCH 03/12] feat: UndocumentedPublicClass supports protected classes refs #4633 Signed-off-by: Kengo TODA --- .../documentation/UndocumentedPublicClass.kt | 5 ++++- .../UndocumentedPublicClassSpec.kt | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt index 70dddc21f57..b38cdd200b2 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt @@ -44,6 +44,9 @@ class UndocumentedPublicClass(config: Config = Config.empty) : Rule(config) { @Configuration("if inner interfaces should be searched") private val searchInInnerInterface: Boolean by config(true) + @Configuration("if protected class should be searched") + private val searchProtectedClass: Boolean by config(false) + override fun visitClass(klass: KtClass) { if (requiresDocumentation(klass)) { reportIfUndocumented(klass) @@ -81,7 +84,7 @@ class UndocumentedPublicClass(config: Config = Config.empty) : Rule(config) { } private fun isPublicAndPublicInherited(element: KtClassOrObject) = - element.isPublicInherited() && element.isPublicNotOverridden() + element.isPublicInherited(searchProtectedClass) && element.isPublicNotOverridden(searchProtectedClass) private fun KtObjectDeclaration.isCompanionWithoutName() = isCompanion() && nameAsSafeName.asString() == "Companion" diff --git a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt index 894ab5ad5cc..046b1eda63c 100644 --- a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt +++ b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt @@ -9,6 +9,7 @@ private const val SEARCH_IN_NESTED_CLASS = "searchInNestedClass" private const val SEARCH_IN_INNER_CLASS = "searchInInnerClass" private const val SEARCH_IN_INNER_OBJECT = "searchInInnerObject" private const val SEARCH_IN_INNER_INTERFACE = "searchInInnerInterface" +private const val SEARCH_PROTECTED_CLASS = "searchProtectedClass" class UndocumentedPublicClassSpec { val subject = UndocumentedPublicClass() @@ -233,4 +234,22 @@ class UndocumentedPublicClassSpec { """ assertThat(subject.compileAndLint(code)).isEmpty() } + + @Test + fun `does not report protected class by default`() { + val code = """ + protected class Test { + } + """ + assertThat(subject.compileAndLint(code)).isEmpty() + } + @Test + fun `reports protected class if configured`() { + val code = """ + protected class Test { + } + """ + val subject = UndocumentedPublicClass(TestConfig(mapOf(SEARCH_PROTECTED_CLASS to "true"))) + assertThat(subject.compileAndLint(code)).hasSize(1) + } } From 86f3c9c1dd02e1e4f659dc0ea36f23cfafb7e75d Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Sat, 16 Jul 2022 14:58:17 +0800 Subject: [PATCH 04/12] chore: apply detekt rules Signed-off-by: Kengo TODA --- .../rules/documentation/UndocumentedPublicFunction.kt | 9 ++++++++- .../rules/documentation/UndocumentedPublicProperty.kt | 2 +- .../rules/documentation/UndocumentedPublicClassSpec.kt | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt index 3d0fe6d9094..06d9eaa3318 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt @@ -1,6 +1,13 @@ package io.gitlab.arturbosch.detekt.rules.documentation -import io.gitlab.arturbosch.detekt.api.* +import io.gitlab.arturbosch.detekt.api.CodeSmell +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.Debt +import io.gitlab.arturbosch.detekt.api.Entity +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.config import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.rules.isProtected import io.gitlab.arturbosch.detekt.rules.isPublicNotOverridden diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt index a0e5a9950ac..8b3940a3976 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt @@ -1,6 +1,5 @@ package io.gitlab.arturbosch.detekt.rules.documentation -import io.gitlab.arturbosch.detekt.api.config import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.Debt @@ -8,6 +7,7 @@ import io.gitlab.arturbosch.detekt.api.Entity 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.config import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.rules.isPublicInherited import io.gitlab.arturbosch.detekt.rules.isPublicNotOverridden diff --git a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt index 046b1eda63c..5d2e83d9be3 100644 --- a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt +++ b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt @@ -243,6 +243,7 @@ class UndocumentedPublicClassSpec { """ assertThat(subject.compileAndLint(code)).isEmpty() } + @Test fun `reports protected class if configured`() { val code = """ From bd82d80076fa66e6601b57a15fadf6f099464862 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Sat, 16 Jul 2022 15:15:28 +0800 Subject: [PATCH 05/12] docs: update the document Signed-off-by: Kengo TODA --- detekt-core/src/main/resources/default-detekt-config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/detekt-core/src/main/resources/default-detekt-config.yml b/detekt-core/src/main/resources/default-detekt-config.yml index 462058ca590..ca9e99fea66 100644 --- a/detekt-core/src/main/resources/default-detekt-config.yml +++ b/detekt-core/src/main/resources/default-detekt-config.yml @@ -78,12 +78,15 @@ comments: searchInInnerClass: true searchInInnerObject: true searchInInnerInterface: true + searchProtectedClass: false UndocumentedPublicFunction: active: false excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + searchProtectedFunction: false UndocumentedPublicProperty: active: false excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] + searchProtectedProperty: false complexity: active: true From 9505b20f5c81a691613af92b44349be09c3c206e Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Sat, 16 Jul 2022 21:27:03 +0800 Subject: [PATCH 06/12] fix: update the API file to pass pre-merge checks Signed-off-by: Kengo TODA --- detekt-psi-utils/api/detekt-psi-utils.api | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/detekt-psi-utils/api/detekt-psi-utils.api b/detekt-psi-utils/api/detekt-psi-utils.api index cdb632ca8a2..d471e90cce2 100644 --- a/detekt-psi-utils/api/detekt-psi-utils.api +++ b/detekt-psi-utils/api/detekt-psi-utils.api @@ -105,7 +105,8 @@ public final class io/gitlab/arturbosch/detekt/rules/KtModifierListKt { public static final fun isOperator (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z public static final fun isOverride (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z public static final fun isProtected (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z - public static final fun isPublicNotOverridden (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z + public static final fun isPublicNotOverridden (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;Z)Z + public static synthetic fun isPublicNotOverridden$default (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;ZILjava/lang/Object;)Z } public final class io/gitlab/arturbosch/detekt/rules/KtValueArgumentKt { @@ -133,7 +134,8 @@ public final class io/gitlab/arturbosch/detekt/rules/ThrowExtensionsKt { } public final class io/gitlab/arturbosch/detekt/rules/TraversingKt { - public static final fun isPublicInherited (Lorg/jetbrains/kotlin/psi/KtNamedDeclaration;)Z + public static final fun isPublicInherited (Lorg/jetbrains/kotlin/psi/KtNamedDeclaration;Z)Z + public static synthetic fun isPublicInherited$default (Lorg/jetbrains/kotlin/psi/KtNamedDeclaration;ZILjava/lang/Object;)Z } public final class io/gitlab/arturbosch/detekt/rules/TypeUtilsKt { From 6e2f19b068748e11fba87c14786fc91f1b1ffc59 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Sun, 17 Jul 2022 07:21:13 +0800 Subject: [PATCH 07/12] fix: rename a config based on the review comment https://github.com/detekt/detekt/pull/5083#discussion_r922660076 Signed-off-by: Kengo TODA --- detekt-core/src/main/resources/default-detekt-config.yml | 2 +- .../detekt/rules/documentation/UndocumentedPublicClass.kt | 4 ++-- .../detekt/rules/documentation/UndocumentedPublicClassSpec.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/detekt-core/src/main/resources/default-detekt-config.yml b/detekt-core/src/main/resources/default-detekt-config.yml index ca9e99fea66..769b232d3d0 100644 --- a/detekt-core/src/main/resources/default-detekt-config.yml +++ b/detekt-core/src/main/resources/default-detekt-config.yml @@ -78,7 +78,7 @@ comments: searchInInnerClass: true searchInInnerObject: true searchInInnerInterface: true - searchProtectedClass: false + searchInProtectedClass: false UndocumentedPublicFunction: active: false excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**'] diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt index b38cdd200b2..ac14a1198ad 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt @@ -45,7 +45,7 @@ class UndocumentedPublicClass(config: Config = Config.empty) : Rule(config) { private val searchInInnerInterface: Boolean by config(true) @Configuration("if protected class should be searched") - private val searchProtectedClass: Boolean by config(false) + private val searchInProtectedClass: Boolean by config(false) override fun visitClass(klass: KtClass) { if (requiresDocumentation(klass)) { @@ -84,7 +84,7 @@ class UndocumentedPublicClass(config: Config = Config.empty) : Rule(config) { } private fun isPublicAndPublicInherited(element: KtClassOrObject) = - element.isPublicInherited(searchProtectedClass) && element.isPublicNotOverridden(searchProtectedClass) + element.isPublicInherited(searchInProtectedClass) && element.isPublicNotOverridden(searchInProtectedClass) private fun KtObjectDeclaration.isCompanionWithoutName() = isCompanion() && nameAsSafeName.asString() == "Companion" diff --git a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt index 5d2e83d9be3..9cd06e0c8e8 100644 --- a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt +++ b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClassSpec.kt @@ -9,7 +9,7 @@ private const val SEARCH_IN_NESTED_CLASS = "searchInNestedClass" private const val SEARCH_IN_INNER_CLASS = "searchInInnerClass" private const val SEARCH_IN_INNER_OBJECT = "searchInInnerObject" private const val SEARCH_IN_INNER_INTERFACE = "searchInInnerInterface" -private const val SEARCH_PROTECTED_CLASS = "searchProtectedClass" +private const val SEARCH_IN_PROTECTED_CLASS = "searchInProtectedClass" class UndocumentedPublicClassSpec { val subject = UndocumentedPublicClass() @@ -250,7 +250,7 @@ class UndocumentedPublicClassSpec { protected class Test { } """ - val subject = UndocumentedPublicClass(TestConfig(mapOf(SEARCH_PROTECTED_CLASS to "true"))) + val subject = UndocumentedPublicClass(TestConfig(mapOf(SEARCH_IN_PROTECTED_CLASS to "true"))) assertThat(subject.compileAndLint(code)).hasSize(1) } } From 296573fa164d137d9661a2b7eb83cf47e7f04b6c Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Mon, 18 Jul 2022 07:11:12 +0800 Subject: [PATCH 08/12] test: make test snippets compilable Signed-off-by: Kengo TODA --- .../rules/documentation/UndocumentedPublicFunctionSpec.kt | 4 ++-- .../rules/documentation/UndocumentedPublicPropertySpec.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunctionSpec.kt b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunctionSpec.kt index 8f7076d90fb..39f4167ff10 100644 --- a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunctionSpec.kt +++ b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunctionSpec.kt @@ -147,7 +147,7 @@ class UndocumentedPublicFunctionSpec { @Test fun `does not report protected functions by default`() { val code = """ - object Test { + open class Test { protected fun noComment1() {} } """ @@ -157,7 +157,7 @@ class UndocumentedPublicFunctionSpec { @Test fun `reports protected functions if configured`() { val code = """ - object Test { + open class Test { protected fun noComment1() {} } """ diff --git a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicPropertySpec.kt b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicPropertySpec.kt index be945b4cba4..1e5fbe9bbbe 100644 --- a/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicPropertySpec.kt +++ b/detekt-rules-documentation/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicPropertySpec.kt @@ -219,7 +219,7 @@ class UndocumentedPublicPropertySpec { @Test fun `does not report undocumented protected properties by default`() { val code = """ - object Test { + open class Test { protected val a = 1 } """ @@ -229,7 +229,7 @@ class UndocumentedPublicPropertySpec { @Test fun `reports undocumented protected properties if configured`() { val code = """ - object Test { + open class Test { protected val a = 1 } """ From f7c0518beb14073b8117a3cdbc78a84eb8ee78ab Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Mon, 18 Jul 2022 20:54:00 +0800 Subject: [PATCH 09/12] fix: broken binary compatibility Signed-off-by: Kengo TODA --- detekt-psi-utils/api/detekt-psi-utils.api | 4 ++-- .../io/gitlab/arturbosch/detekt/rules/KtModifierList.kt | 5 ++++- .../kotlin/io/gitlab/arturbosch/detekt/rules/Traversing.kt | 4 +++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/detekt-psi-utils/api/detekt-psi-utils.api b/detekt-psi-utils/api/detekt-psi-utils.api index d471e90cce2..914b08d2b6a 100644 --- a/detekt-psi-utils/api/detekt-psi-utils.api +++ b/detekt-psi-utils/api/detekt-psi-utils.api @@ -105,8 +105,8 @@ public final class io/gitlab/arturbosch/detekt/rules/KtModifierListKt { public static final fun isOperator (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z public static final fun isOverride (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z public static final fun isProtected (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z + public static final fun isPublicNotOverridden (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;)Z public static final fun isPublicNotOverridden (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;Z)Z - public static synthetic fun isPublicNotOverridden$default (Lorg/jetbrains/kotlin/psi/KtModifierListOwner;ZILjava/lang/Object;)Z } public final class io/gitlab/arturbosch/detekt/rules/KtValueArgumentKt { @@ -134,8 +134,8 @@ public final class io/gitlab/arturbosch/detekt/rules/ThrowExtensionsKt { } public final class io/gitlab/arturbosch/detekt/rules/TraversingKt { + public static final fun isPublicInherited (Lorg/jetbrains/kotlin/psi/KtNamedDeclaration;)Z public static final fun isPublicInherited (Lorg/jetbrains/kotlin/psi/KtNamedDeclaration;Z)Z - public static synthetic fun isPublicInherited$default (Lorg/jetbrains/kotlin/psi/KtNamedDeclaration;ZILjava/lang/Object;)Z } public final class io/gitlab/arturbosch/detekt/rules/TypeUtilsKt { diff --git a/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/KtModifierList.kt b/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/KtModifierList.kt index 5e425dc7372..97204905312 100644 --- a/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/KtModifierList.kt +++ b/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/KtModifierList.kt @@ -6,7 +6,10 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.psiUtil.isPublic -fun KtModifierListOwner.isPublicNotOverridden(considerProtectedAsPublic: Boolean = false) = +fun KtModifierListOwner.isPublicNotOverridden() = + isPublicNotOverridden(false) + +fun KtModifierListOwner.isPublicNotOverridden(considerProtectedAsPublic: Boolean) = if (considerProtectedAsPublic) { isPublic || isProtected() } else { diff --git a/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/Traversing.kt b/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/Traversing.kt index 842db32c935..fec929f3c1e 100644 --- a/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/Traversing.kt +++ b/detekt-psi-utils/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/Traversing.kt @@ -20,7 +20,9 @@ inline fun KtElement.parentsOfTyp } } -fun KtNamedDeclaration.isPublicInherited(considerProtectedAsPublic: Boolean = false): Boolean { +fun KtNamedDeclaration.isPublicInherited(): Boolean = isPublicInherited(false) + +fun KtNamedDeclaration.isPublicInherited(considerProtectedAsPublic: Boolean): Boolean { var classOrObject = containingClassOrObject while (classOrObject != null) { if (!classOrObject.isPublic && !(considerProtectedAsPublic && classOrObject.isProtected())) { From 5f316649449a05130003d8c608e8c90ceea89132 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Thu, 21 Jul 2022 08:23:36 +0800 Subject: [PATCH 10/12] docs: Update detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt Co-authored-by: schalkms <30376729+schalkms@users.noreply.github.com> --- .../detekt/rules/documentation/UndocumentedPublicClass.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt index ac14a1198ad..c9f971d3285 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicClass.kt @@ -44,7 +44,7 @@ class UndocumentedPublicClass(config: Config = Config.empty) : Rule(config) { @Configuration("if inner interfaces should be searched") private val searchInInnerInterface: Boolean by config(true) - @Configuration("if protected class should be searched") + @Configuration("if protected classes should be searched") private val searchInProtectedClass: Boolean by config(false) override fun visitClass(klass: KtClass) { From 4ade0a8884c6a8748e857b37a51889c52001aa7b Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Thu, 21 Jul 2022 08:23:43 +0800 Subject: [PATCH 11/12] docs: Update detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt Co-authored-by: schalkms <30376729+schalkms@users.noreply.github.com> --- .../detekt/rules/documentation/UndocumentedPublicFunction.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt index 06d9eaa3318..c229e25ce07 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicFunction.kt @@ -30,7 +30,7 @@ class UndocumentedPublicFunction(config: Config = Config.empty) : Rule(config) { Debt.TWENTY_MINS ) - @Configuration("if protected function should be searched") + @Configuration("if protected functions should be searched") private val searchProtectedFunction: Boolean by config(false) override fun visitNamedFunction(function: KtNamedFunction) { From 1a6a1d0dfd17df7f576e3f7f5042d2f80580ce08 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Thu, 21 Jul 2022 08:23:50 +0800 Subject: [PATCH 12/12] docs: Update detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt Co-authored-by: schalkms <30376729+schalkms@users.noreply.github.com> --- .../detekt/rules/documentation/UndocumentedPublicProperty.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt index 8b3940a3976..62edb37efd0 100644 --- a/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt +++ b/detekt-rules-documentation/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/documentation/UndocumentedPublicProperty.kt @@ -33,7 +33,7 @@ class UndocumentedPublicProperty(config: Config = Config.empty) : Rule(config) { Debt.TWENTY_MINS ) - @Configuration("if protected function should be searched") + @Configuration("if protected functions should be searched") private val searchProtectedProperty: Boolean by config(false) override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor) {