diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt index 504331de00b..7ec9943858e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt @@ -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
$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("") // Cut off light method signature + } + } + } return renderedDecl } diff --git a/idea/testData/editor/quickDoc/JavaDocFromOverridenClass.kt b/idea/testData/editor/quickDoc/JavaDocFromOverridenClass.kt new file mode 100644 index 00000000000..70ceeb3bf57 --- /dev/null +++ b/idea/testData/editor/quickDoc/JavaDocFromOverridenClass.kt @@ -0,0 +1,9 @@ +class A : OverrideMe() { + override fun overrideMe() { + } +} + + +//INFO: protected open fun overrideMe(): Unit defined in A
Description copied from class: OverrideMe
+//INFO: Some comment +//INFO:
Overrides:
overrideMe in class OverrideMe
diff --git a/idea/testData/editor/quickDoc/JavaDocFromOverridenClass_Data.java b/idea/testData/editor/quickDoc/JavaDocFromOverridenClass_Data.java new file mode 100644 index 00000000000..e813eb834ef --- /dev/null +++ b/idea/testData/editor/quickDoc/JavaDocFromOverridenClass_Data.java @@ -0,0 +1,6 @@ +public class OverrideMe { + /** + * Some comment + */ + void overrideMe(); +} \ No newline at end of file diff --git a/idea/testData/editor/quickDoc/JavaDocFromOverridenInterface.kt b/idea/testData/editor/quickDoc/JavaDocFromOverridenInterface.kt new file mode 100644 index 00000000000..b75eeb8e565 --- /dev/null +++ b/idea/testData/editor/quickDoc/JavaDocFromOverridenInterface.kt @@ -0,0 +1,9 @@ +class A : OverrideMe { + override fun overrideMe() { + } +} + + +//INFO: public open fun overrideMe(): Unit defined in A
Description copied from interface: OverrideMe
+//INFO: Some comment +//INFO:
Specified by:
overrideMe in interface OverrideMe
diff --git a/idea/testData/editor/quickDoc/JavaDocFromOverridenInterface_Data.java b/idea/testData/editor/quickDoc/JavaDocFromOverridenInterface_Data.java new file mode 100644 index 00000000000..625349d382f --- /dev/null +++ b/idea/testData/editor/quickDoc/JavaDocFromOverridenInterface_Data.java @@ -0,0 +1,6 @@ +interface OverrideMe { + /** + * Some comment + */ + void overrideMe(); +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java index f2366cc08b1..e9a1388d2d4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java @@ -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");