From b4ebd6074c386c6fc7183fd82879431d444a9134 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Sat, 1 Apr 2017 03:10:14 +0300 Subject: [PATCH] Restore quick doc for it parameter and this of extension function --- .../idea/KotlinQuickDocumentationProvider.kt | 27 +++++++++++++++++++ .../quickDoc/AtImplicitLambdaParametEnd.kt | 7 +++++ .../quickDoc/AtImplicitLambdaParameter.kt | 2 +- .../editor/quickDoc/ExtensionReceiver.kt | 10 +++++++ .../editor/quickDoc/ExtensionReceiverEnd.kt | 10 +++++++ .../QuickDocProviderTestGenerated.java | 18 +++++++++++++ 6 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 idea/testData/editor/quickDoc/AtImplicitLambdaParametEnd.kt create mode 100644 idea/testData/editor/quickDoc/ExtensionReceiver.kt create mode 100644 idea/testData/editor/quickDoc/ExtensionReceiverEnd.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt index 45abdaf5c20..d3b36bbe210 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt @@ -24,6 +24,7 @@ import com.intellij.lang.java.JavaDocumentationProvider import com.intellij.openapi.diagnostic.Logger import com.intellij.psi.PsiElement import com.intellij.psi.PsiManager +import com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration import org.jetbrains.kotlin.config.LanguageVersionSettings @@ -151,6 +152,23 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { } private fun getText(element: PsiElement, originalElement: PsiElement?, quickNavigation: Boolean): String? { + if (element is PsiWhiteSpace) { + val itElement = findElementWithText(originalElement, "it") + val itReference = itElement?.getParentOfType(false) + if (itReference != null) { + return getText(itReference, originalElement, quickNavigation) + } + } + + if (element is KtTypeReference) { + val declaration = element.parent + if (declaration is KtCallableDeclaration && declaration.receiverTypeReference == element) { + val thisElement = findElementWithText(originalElement, "this") + if (thisElement != null) { + return getText(declaration, originalElement, quickNavigation) + } + } + } if (element is KtClass && element.isEnum()) { // When caret on special enum function (e.g SomeEnum.values()) @@ -301,5 +319,14 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { return null } + + private fun findElementWithText(element: PsiElement?, text: String): PsiElement? { + return when { + element == null -> null + element.text == text -> element + element.prevLeaf()?.text == text -> element.prevLeaf() + else -> null + } + } } } diff --git a/idea/testData/editor/quickDoc/AtImplicitLambdaParametEnd.kt b/idea/testData/editor/quickDoc/AtImplicitLambdaParametEnd.kt new file mode 100644 index 00000000000..a2116c0cda2 --- /dev/null +++ b/idea/testData/editor/quickDoc/AtImplicitLambdaParametEnd.kt @@ -0,0 +1,7 @@ +fun foo() { + listOf(1).forEach { + println(it) + } +} + +//INFO:
value-parameter it: Int
diff --git a/idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt b/idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt index a2116c0cda2..9e988b29111 100644 --- a/idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt +++ b/idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt @@ -1,6 +1,6 @@ fun foo() { listOf(1).forEach { - println(it) + println(it) } } diff --git a/idea/testData/editor/quickDoc/ExtensionReceiver.kt b/idea/testData/editor/quickDoc/ExtensionReceiver.kt new file mode 100644 index 00000000000..d3fa64995d8 --- /dev/null +++ b/idea/testData/editor/quickDoc/ExtensionReceiver.kt @@ -0,0 +1,10 @@ + +interface Foo + +fun foo(a: Any) {} + +fun Foo.bar() { + foo(this) +} + +//INFO:
public fun Foo.bar(): Unit defined in root package
diff --git a/idea/testData/editor/quickDoc/ExtensionReceiverEnd.kt b/idea/testData/editor/quickDoc/ExtensionReceiverEnd.kt new file mode 100644 index 00000000000..2ff375d358e --- /dev/null +++ b/idea/testData/editor/quickDoc/ExtensionReceiverEnd.kt @@ -0,0 +1,10 @@ + +interface Foo + +fun foo(a: Any) {} + +fun Foo.bar() { + foo(this) +} + +//INFO:
public fun Foo.bar(): Unit defined in root package
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 16afaf5e1bc..e124dc64c9e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java @@ -48,6 +48,12 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest doTest(fileName); } + @TestMetadata("AtImplicitLambdaParametEnd.kt") + public void testAtImplicitLambdaParametEnd() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/AtImplicitLambdaParametEnd.kt"); + doTest(fileName); + } + @TestMetadata("AtImplicitLambdaParameter.kt") public void testAtImplicitLambdaParameter() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt"); @@ -90,6 +96,18 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest doTest(fileName); } + @TestMetadata("ExtensionReceiver.kt") + public void testExtensionReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/ExtensionReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("ExtensionReceiverEnd.kt") + public void testExtensionReceiverEnd() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/ExtensionReceiverEnd.kt"); + doTest(fileName); + } + @TestMetadata("IndentedCodeBlock.kt") public void testIndentedCodeBlock() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/IndentedCodeBlock.kt");