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