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");