From 79fff4aa3c28cf7a2666d174c6a7310bd7ac5beb Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Tue, 5 Jul 2016 13:51:56 +0200 Subject: [PATCH] Show quick doc for implicit lambda parameter 'it' (#889) * Show quick doc for implicit lambda parameter 'it' Fixes #KT-9271 * Remove useless code --- .../idea/KotlinQuickDocumentationProvider.kt | 24 ++++++++++++++----- .../quickDoc/AtImplicitLambdaParameter.kt | 7 ++++++ .../QuickDocProviderTestGenerated.java | 6 +++++ 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt index d9ffdcaf849..3073398bc92 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinQuickDocumentationProvider.kt @@ -32,9 +32,8 @@ import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject import org.jetbrains.kotlin.idea.kdoc.KDocRenderer import org.jetbrains.kotlin.idea.kdoc.findKDoc import org.jetbrains.kotlin.idea.kdoc.resolveKDocLink -import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtReferenceExpression +import org.jetbrains.kotlin.idea.references.mainReference +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.renderer.ClassifierNamePolicy @@ -92,6 +91,9 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { if (element is KtDeclaration) { return renderKotlinDeclaration(element, quickNavigation) } + else if (element is KtNameReferenceExpression && element.getReferencedName() == "it") { + return renderKotlinImplicitLambdaParameter(element, quickNavigation) + } else if (element is KtLightDeclaration<*, *>) { val origin = element.kotlinOrigin ?: return null return renderKotlinDeclaration(origin, quickNavigation) @@ -114,15 +116,25 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { return null } - private fun renderKotlinDeclaration(declaration: KtDeclaration, quickNavigation: Boolean): String { + private fun renderKotlinDeclaration(declaration: KtExpression, quickNavigation: Boolean): String { val context = declaration.analyze(BodyResolveMode.PARTIAL) - var declarationDescriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, declaration] + val declarationDescriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, declaration] if (declarationDescriptor == null) { LOG.info("Failed to find descriptor for declaration " + declaration.getElementTextWithContext()) return "No documentation available" } + return renderKotlin(context, declarationDescriptor, quickNavigation) + } + + private fun renderKotlinImplicitLambdaParameter(element: KtReferenceExpression, quickNavigation: Boolean): String? { + val context = element.analyze(BodyResolveMode.PARTIAL) + val target = element.mainReference.resolveToDescriptors(context).singleOrNull() as? ValueParameterDescriptor? ?: return null + return renderKotlin(context, target, quickNavigation) + } + + private fun renderKotlin(context: BindingContext, declarationDescriptor: DeclarationDescriptor, quickNavigation: Boolean): String { if (declarationDescriptor is ValueParameterDescriptor) { val property = context[BindingContext.VALUE_PARAMETER_AS_PROPERTY, declarationDescriptor] if (property != null) { @@ -132,7 +144,7 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() { var renderedDecl = DESCRIPTOR_RENDERER.render(declarationDescriptor) if (!quickNavigation) { - renderedDecl = "
" + renderedDecl + "
" + renderedDecl = "
$renderedDecl
" } val comment = declarationDescriptor.findKDoc() if (comment != null) { diff --git a/idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt b/idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt new file mode 100644 index 00000000000..5da8e91eb63 --- /dev/null +++ b/idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt @@ -0,0 +1,7 @@ +fun foo() { + listOf(1).forEach { + println(it) + } +} + +//INFO: value-parameter it: Int defined in foo.<anonymous> \ 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 fdfbe7277f4..8af3608c545 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/editor/quickDoc/QuickDocProviderTestGenerated.java @@ -41,6 +41,12 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest doTest(fileName); } + @TestMetadata("AtImplicitLambdaParameter.kt") + public void testAtImplicitLambdaParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/AtImplicitLambdaParameter.kt"); + doTest(fileName); + } + @TestMetadata("AtTypeParameter.kt") public void testAtTypeParameter() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/AtTypeParameter.kt");