KT-20888: Do not report missing documentation when inherit from lib
Find KDoc using DescriptorToSourceUtilsIde when required #KT-20888 fixed
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.kdoc
|
package org.jetbrains.kotlin.idea.kdoc
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.kdoc.parser.KDocKnownTag
|
import org.jetbrains.kotlin.kdoc.parser.KDocKnownTag
|
||||||
import org.jetbrains.kotlin.kdoc.psi.api.KDoc
|
import org.jetbrains.kotlin.kdoc.psi.api.KDoc
|
||||||
@@ -23,11 +24,13 @@ import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag
|
|||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
|
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getParentOfType
|
||||||
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
|
|
||||||
fun DeclarationDescriptor.findKDoc(): KDocTag? {
|
fun DeclarationDescriptor.findKDoc(
|
||||||
|
descriptorToPsi: (DeclarationDescriptorWithSource) -> PsiElement? = { DescriptorToSourceUtils.descriptorToDeclaration(it) }
|
||||||
|
): KDocTag? {
|
||||||
if (this is DeclarationDescriptorWithSource) {
|
if (this is DeclarationDescriptorWithSource) {
|
||||||
var psiDeclaration = (this.source as? PsiSourceElement)?.psi?.navigationElement
|
var psiDeclaration = descriptorToPsi(this)?.navigationElement
|
||||||
// KDoc for primary constructor is located inside of its class KDoc
|
// KDoc for primary constructor is located inside of its class KDoc
|
||||||
if (psiDeclaration is KtPrimaryConstructor) {
|
if (psiDeclaration is KtPrimaryConstructor) {
|
||||||
psiDeclaration = psiDeclaration.getContainingClassOrObject()
|
psiDeclaration = psiDeclaration.getContainingClassOrObject()
|
||||||
@@ -51,7 +54,7 @@ fun DeclarationDescriptor.findKDoc(): KDocTag? {
|
|||||||
if (this is PropertyDescriptor) {
|
if (this is PropertyDescriptor) {
|
||||||
val containingClassDescriptor = this.containingDeclaration as? ClassDescriptor
|
val containingClassDescriptor = this.containingDeclaration as? ClassDescriptor
|
||||||
if (containingClassDescriptor != null) {
|
if (containingClassDescriptor != null) {
|
||||||
val classKDoc = containingClassDescriptor.findKDoc()?.getParentOfType<KDoc>(false)
|
val classKDoc = containingClassDescriptor.findKDoc(descriptorToPsi)?.getParentOfType<KDoc>(false)
|
||||||
if (classKDoc != null) {
|
if (classKDoc != null) {
|
||||||
val propertySection = classKDoc.findSectionByTag(KDocKnownTag.PROPERTY,
|
val propertySection = classKDoc.findSectionByTag(KDocKnownTag.PROPERTY,
|
||||||
getName().asString())
|
getName().asString())
|
||||||
@@ -64,7 +67,7 @@ fun DeclarationDescriptor.findKDoc(): KDocTag? {
|
|||||||
|
|
||||||
if (this is CallableDescriptor) {
|
if (this is CallableDescriptor) {
|
||||||
for (baseDescriptor in this.overriddenDescriptors) {
|
for (baseDescriptor in this.overriddenDescriptors) {
|
||||||
val baseKDoc = baseDescriptor.original.findKDoc()
|
val baseKDoc = baseDescriptor.original.findKDoc(descriptorToPsi)
|
||||||
if (baseKDoc != null) {
|
if (baseKDoc != null) {
|
||||||
return baseKDoc
|
return baseKDoc
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
renderedDecl += renderDeprecationInfo(declarationDescriptor, deprecationProvider)
|
renderedDecl += renderDeprecationInfo(declarationDescriptor, deprecationProvider)
|
||||||
|
|
||||||
if (!quickNavigation) {
|
if (!quickNavigation) {
|
||||||
val comment = declarationDescriptor.findKDoc()
|
val comment = declarationDescriptor.findKDoc { DescriptorToSourceUtilsIde.getAnyDeclaration(ktElement.project, it) }
|
||||||
if (comment != null) {
|
if (comment != null) {
|
||||||
val renderedComment = KDocRenderer.renderKDoc(comment)
|
val renderedComment = KDocRenderer.renderKDoc(comment)
|
||||||
if (renderedComment.startsWith("<p>")) {
|
if (renderedComment.startsWith("<p>")) {
|
||||||
|
|||||||
+2
-1
@@ -27,6 +27,7 @@ import com.intellij.psi.impl.source.PostprocessReformattingAspect
|
|||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
|
||||||
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
import org.jetbrains.kotlin.descriptors.MemberDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||||
|
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
|
||||||
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
|
||||||
@@ -55,7 +56,7 @@ class KDocMissingDocumentationInspection() : AbstractKotlinInspection() {
|
|||||||
as? DeclarationDescriptorWithVisibility
|
as? DeclarationDescriptorWithVisibility
|
||||||
as? MemberDescriptor ?: return
|
as? MemberDescriptor ?: return
|
||||||
if (nameIdentifier != null && descriptor.isEffectivelyPublicApi) {
|
if (nameIdentifier != null && descriptor.isEffectivelyPublicApi) {
|
||||||
if (descriptor.findKDoc() == null) {
|
if (descriptor.findKDoc { DescriptorToSourceUtilsIde.getAnyDeclaration(element.project, it) } == null) {
|
||||||
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())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user