Show quick doc for implicit lambda parameter 'it' (#889)

* Show quick doc for implicit lambda parameter 'it'
Fixes #KT-9271

* Remove useless code
This commit is contained in:
Kirill Rakhman
2016-07-05 13:51:56 +02:00
committed by Dmitry Jemerov
parent a770fe2ec8
commit 79fff4aa3c
3 changed files with 31 additions and 6 deletions
@@ -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 = "<pre>" + renderedDecl + "</pre>"
renderedDecl = "<pre>$renderedDecl</pre>"
}
val comment = declarationDescriptor.findKDoc()
if (comment != null) {
@@ -0,0 +1,7 @@
fun foo() {
listOf(1).forEach {
println(it<caret>)
}
}
//INFO: <b>value-parameter</b> it: Int <i>defined in</i> foo.&lt;anonymous&gt;
@@ -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");