Correctly detect visibility in KDocMissingDocumentationInspection
#KT-20887 fixed #KT-20889 fixed
This commit is contained in:
+8
-9
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user