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:
Simon Ogorodnik
2017-10-23 04:20:42 +03:00
parent fb876e398c
commit 94e39a4c6c
3 changed files with 11 additions and 7 deletions
@@ -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>")) {
@@ -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())
} }