Correctly detect visibility in KDocMissingDocumentationInspection

#KT-20887 fixed
 #KT-20889 fixed
This commit is contained in:
Simon Ogorodnik
2017-10-23 02:21:02 +03:00
parent f21e1c60e0
commit fb876e398c
2 changed files with 28 additions and 18 deletions
@@ -24,23 +24,23 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.impl.source.PostprocessReformattingAspect 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.MemberDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.unblockDocument import org.jetbrains.kotlin.idea.core.unblockDocument
import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection
import org.jetbrains.kotlin.idea.inspections.describe import org.jetbrains.kotlin.idea.inspections.describe
import org.jetbrains.kotlin.idea.inspections.findExistingEditor import org.jetbrains.kotlin.idea.inspections.findExistingEditor
import org.jetbrains.kotlin.idea.kdoc.KDocElementFactory 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.kdoc.psi.impl.KDocSection
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.psi.psiUtil.getChildOfType
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType 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.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.source.getPsi
class KDocMissingDocumentationInspection() : AbstractKotlinInspection() { class KDocMissingDocumentationInspection() : AbstractKotlinInspection() {
override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor = override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor =
@@ -51,12 +51,11 @@ class KDocMissingDocumentationInspection() : AbstractKotlinInspection() {
if (element is KtNamedDeclaration) { if (element is KtNamedDeclaration) {
val nameIdentifier = element.nameIdentifier val nameIdentifier = element.nameIdentifier
val descriptor = element.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? MemberDescriptor val descriptor = element.resolveToDescriptorIfAny(BodyResolveMode.FULL)
if (nameIdentifier != null && descriptor?.visibility == Visibilities.PUBLIC) { as? DeclarationDescriptorWithVisibility
val hasDocumentation = element.docComment != null || as? MemberDescriptor ?: return
(descriptor as? CallableMemberDescriptor)?.overriddenDescriptors if (nameIdentifier != null && descriptor.isEffectivelyPublicApi) {
?.any { (it.source.getPsi() as? KtNamedDeclaration)?.docComment != null } ?: false if (descriptor.findKDoc() == null) {
if (!hasDocumentation) {
val message = element.describe()?.let { "$it is missing documentation" } ?: "Missing documentation" val message = element.describe()?.let { "$it is missing documentation" } ?: "Missing documentation"
holder.registerProblem(nameIdentifier, message, AddDocumentationFix()) holder.registerProblem(nameIdentifier, message, AddDocumentationFix())
} }
+20 -9
View File
@@ -1,6 +1,6 @@
public fun <warning descr="Missing documentation">publicUndocumentedFun</warning>() {} public fun <warning descr="Function ''publicUndocumentedFun'' is missing documentation">publicUndocumentedFun</warning>() {}
fun <warning descr="Missing documentation">defaultUndocumentedFun</warning>() {} fun <warning descr="Function ''defaultUndocumentedFun'' is missing documentation">defaultUndocumentedFun</warning>() {}
/** Some documentation */ /** Some documentation */
public fun publicDocumentedFun() {} public fun publicDocumentedFun() {}
@@ -13,8 +13,8 @@ internal fun internalUndocumentedFun() {}
public class <warning descr="Missing documentation">publicUndocumentedClass</warning>() {} public class <warning descr="Class ''publicUndocumentedClass'' is missing documentation">publicUndocumentedClass</warning>() {}
class <warning descr="Missing documentation">defaultUndocumentedClass</warning>() {} class <warning descr="Class ''defaultUndocumentedClass'' is missing documentation">defaultUndocumentedClass</warning>() {}
/** Some documentation */ /** Some documentation */
public class publicDocumentedClass() {} public class publicDocumentedClass() {}
@@ -29,8 +29,8 @@ internal class internalUndocumentedClass() {}
private open class Properties { private open class Properties {
public open val <warning descr="Missing documentation">publicUndocumentedProperty</warning>: Int = 0 public open val publicUndocumentedProperty: Int = 0
open val <warning descr="Missing documentation">defaultUndocumentedProperty</warning>: Int = 0 open val defaultUndocumentedProperty: Int = 0
/** Some documentation */ /** Some documentation */
public open val publicDocumentedProperty: Int = 0 public open val publicDocumentedProperty: Int = 0
@@ -51,14 +51,14 @@ private open class Properties {
} }
private open class ChildClass : Properties() { private open class ChildClass : Properties() {
override val <warning descr="Missing documentation">publicUndocumentedProperty</warning>: Int = 4 override val publicUndocumentedProperty: Int = 4
override val <warning descr="Missing documentation">defaultUndocumentedProperty</warning>: Int = 4 override val defaultUndocumentedProperty: Int = 4
override val publicDocumentedProperty: Int = 4 override val publicDocumentedProperty: Int = 4
override val defaultDocumentedProperty: Int = 4 override val defaultDocumentedProperty: Int = 4
/** Some documentation */ /** Some documentation */
override public val internalUndocumentedProperty: Int = 4 override public val internalUndocumentedProperty: Int = 4
override public val <warning descr="Missing documentation">protectedUndocumentedProperty</warning>: Int = 4 override public val protectedUndocumentedProperty: Int = 4
override public val protectedDocumentedProperty: Int = 4 override public val protectedDocumentedProperty: Int = 4
} }
@@ -66,4 +66,15 @@ private class GrandChildClass : ChildClass() {
override public val internalUndocumentedProperty: Int = 6 override public val internalUndocumentedProperty: Int = 6
} }
open class <warning descr="Class ''SomeClass'' is missing documentation">SomeClass</warning> {
protected fun <warning descr="Function ''testProtected'' is missing documentation">testProtected</warning>() = 1
}
class <warning descr="Class ''FinalClassWithProtected'' is missing documentation">FinalClassWithProtected</warning> {
protected fun <warning descr="Function ''testProtected'' is missing documentation">testProtected</warning>() = 1
}
private class PrimaryCon(val p: String)
// NO_CHECK_INFOS // NO_CHECK_INFOS