Fix for KT-13699 Quick documentation doesn't show supertype docs for overridden Java

This commit is contained in:
Simon Ogorodnik
2016-11-15 16:50:11 +03:00
parent b93c37faa2
commit 1c75c02dfe
6 changed files with 61 additions and 0 deletions
@@ -18,12 +18,18 @@ package org.jetbrains.kotlin.idea
import com.google.common.html.HtmlEscapers
import com.intellij.codeInsight.documentation.DocumentationManagerUtil
import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator
import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory
import com.intellij.lang.documentation.AbstractDocumentationProvider
import com.intellij.lang.java.JavaDocumentationProvider
import com.intellij.lang.java.JavaLanguage
import com.intellij.openapi.diagnostic.Logger
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
@@ -36,6 +42,7 @@ import org.jetbrains.kotlin.idea.kdoc.findKDoc
import org.jetbrains.kotlin.idea.kdoc.isBoringBuiltinClass
import org.jetbrains.kotlin.idea.kdoc.resolveKDocLink
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
@@ -169,6 +176,18 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
renderedDecl = "$renderedDecl<br/>$renderedComment"
}
}
else {
if (declarationDescriptor is CallableDescriptor) { // If we couldn't find KDoc, try to find javadoc in one of super's
val psi = declarationDescriptor.findPsi() as? KtFunction
if (psi != null) {
val lightElement = LightClassUtil.getLightClassMethod(psi) // Light method for super's scan in javadoc info gen
val javaDocInfoGenerator = JavaDocInfoGeneratorFactory.create(psi.project, lightElement)
val builder = StringBuilder()
if (javaDocInfoGenerator.generateDocInfoCore(builder, false))
renderedDecl += builder.toString().substringAfter("</PRE>") // Cut off light method signature
}
}
}
return renderedDecl
}
@@ -0,0 +1,9 @@
class A : OverrideMe() {
override fun <caret>overrideMe() {
}
}
//INFO: <b>protected</b> <b>open</b> <b>fun</b> overrideMe(): Unit <i>defined in</i> A<DD><DL><DT><b>Description copied from class:</b>&nbsp;<a href="psi_element://OverrideMe"><code>OverrideMe</code></a><br>
//INFO: Some comment
//INFO: </DD></DL></DD><DD><DL><DT><b>Overrides:</b><DD><a href="psi_element://OverrideMe#overrideMe()"><code>overrideMe</code></a> in class <a href="psi_element://OverrideMe"><code>OverrideMe</code></a></DD></DL></DD>
@@ -0,0 +1,6 @@
public class OverrideMe {
/**
* Some comment
*/
void overrideMe();
}
@@ -0,0 +1,9 @@
class A : OverrideMe {
override fun <caret>overrideMe() {
}
}
//INFO: <b>public</b> <b>open</b> <b>fun</b> overrideMe(): Unit <i>defined in</i> A<DD><DL><DT><b>Description copied from interface:</b>&nbsp;<a href="psi_element://OverrideMe"><code>OverrideMe</code></a><br>
//INFO: Some comment
//INFO: </DD></DL></DD><DD><DL><DT><b>Specified by:</b><DD><a href="psi_element://OverrideMe#overrideMe()"><code>overrideMe</code></a> in interface <a href="psi_element://OverrideMe"><code>OverrideMe</code></a></DD></DL></DD>
@@ -0,0 +1,6 @@
interface OverrideMe {
/**
* Some comment
*/
void overrideMe();
}
@@ -96,6 +96,18 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest
doTest(fileName);
}
@TestMetadata("JavaDocFromOverridenClass.kt")
public void testJavaDocFromOverridenClass() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/JavaDocFromOverridenClass.kt");
doTest(fileName);
}
@TestMetadata("JavaDocFromOverridenInterface.kt")
public void testJavaDocFromOverridenInterface() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/JavaDocFromOverridenInterface.kt");
doTest(fileName);
}
@TestMetadata("JavaMethodUsedInKotlin.kt")
public void testJavaMethodUsedInKotlin() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/JavaMethodUsedInKotlin.kt");