From fb876e398c73898f1ca5ffc3de58deb3b66c646c Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Mon, 23 Oct 2017 02:21:02 +0300 Subject: [PATCH] Correctly detect visibility in KDocMissingDocumentationInspection #KT-20887 fixed #KT-20889 fixed --- .../KDocMissingDocumentationInspection.kt | 17 +++++------ .../kdoc/highlighting/MissingDocumentation.kt | 29 +++++++++++++------ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/kdoc/KDocMissingDocumentationInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/kdoc/KDocMissingDocumentationInspection.kt index 0e26e5dfe67..394698d4db7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/kdoc/KDocMissingDocumentationInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/kdoc/KDocMissingDocumentationInspection.kt @@ -24,23 +24,23 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import com.intellij.psi.impl.source.PostprocessReformattingAspect -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility import org.jetbrains.kotlin.descriptors.MemberDescriptor -import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.core.unblockDocument import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection import org.jetbrains.kotlin.idea.inspections.describe import org.jetbrains.kotlin.idea.inspections.findExistingEditor import org.jetbrains.kotlin.idea.kdoc.KDocElementFactory +import org.jetbrains.kotlin.idea.kdoc.findKDoc import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPublicApi import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.resolve.source.getPsi class KDocMissingDocumentationInspection() : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor = @@ -51,12 +51,11 @@ class KDocMissingDocumentationInspection() : AbstractKotlinInspection() { if (element is KtNamedDeclaration) { val nameIdentifier = element.nameIdentifier - val descriptor = element.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? MemberDescriptor - if (nameIdentifier != null && descriptor?.visibility == Visibilities.PUBLIC) { - val hasDocumentation = element.docComment != null || - (descriptor as? CallableMemberDescriptor)?.overriddenDescriptors - ?.any { (it.source.getPsi() as? KtNamedDeclaration)?.docComment != null } ?: false - if (!hasDocumentation) { + val descriptor = element.resolveToDescriptorIfAny(BodyResolveMode.FULL) + as? DeclarationDescriptorWithVisibility + as? MemberDescriptor ?: return + if (nameIdentifier != null && descriptor.isEffectivelyPublicApi) { + if (descriptor.findKDoc() == null) { val message = element.describe()?.let { "$it is missing documentation" } ?: "Missing documentation" holder.registerProblem(nameIdentifier, message, AddDocumentationFix()) } diff --git a/idea/testData/kdoc/highlighting/MissingDocumentation.kt b/idea/testData/kdoc/highlighting/MissingDocumentation.kt index b2d65a7abef..34d652209a1 100644 --- a/idea/testData/kdoc/highlighting/MissingDocumentation.kt +++ b/idea/testData/kdoc/highlighting/MissingDocumentation.kt @@ -1,6 +1,6 @@ -public fun publicUndocumentedFun() {} -fun defaultUndocumentedFun() {} +public fun publicUndocumentedFun() {} +fun defaultUndocumentedFun() {} /** Some documentation */ public fun publicDocumentedFun() {} @@ -13,8 +13,8 @@ internal fun internalUndocumentedFun() {} -public class publicUndocumentedClass() {} -class defaultUndocumentedClass() {} +public class publicUndocumentedClass() {} +class defaultUndocumentedClass() {} /** Some documentation */ public class publicDocumentedClass() {} @@ -29,8 +29,8 @@ internal class internalUndocumentedClass() {} private open class Properties { - public open val publicUndocumentedProperty: Int = 0 - open val defaultUndocumentedProperty: Int = 0 + public open val publicUndocumentedProperty: Int = 0 + open val defaultUndocumentedProperty: Int = 0 /** Some documentation */ public open val publicDocumentedProperty: Int = 0 @@ -51,14 +51,14 @@ private open class Properties { } private open class ChildClass : Properties() { - override val publicUndocumentedProperty: Int = 4 - override val defaultUndocumentedProperty: Int = 4 + override val publicUndocumentedProperty: Int = 4 + override val defaultUndocumentedProperty: Int = 4 override val publicDocumentedProperty: Int = 4 override val defaultDocumentedProperty: Int = 4 /** Some documentation */ override public val internalUndocumentedProperty: Int = 4 - override public val protectedUndocumentedProperty: Int = 4 + override public val protectedUndocumentedProperty: Int = 4 override public val protectedDocumentedProperty: Int = 4 } @@ -66,4 +66,15 @@ private class GrandChildClass : ChildClass() { override public val internalUndocumentedProperty: Int = 6 } +open class SomeClass { + protected fun testProtected() = 1 +} + +class FinalClassWithProtected { + protected fun testProtected() = 1 +} + +private class PrimaryCon(val p: String) + + // NO_CHECK_INFOS