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:
committed by
Dmitry Jemerov
parent
a770fe2ec8
commit
79fff4aa3c
@@ -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.KDocRenderer
|
||||||
import org.jetbrains.kotlin.idea.kdoc.findKDoc
|
import org.jetbrains.kotlin.idea.kdoc.findKDoc
|
||||||
import org.jetbrains.kotlin.idea.kdoc.resolveKDocLink
|
import org.jetbrains.kotlin.idea.kdoc.resolveKDocLink
|
||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.idea.references.mainReference
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.KtReferenceExpression
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
|
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
||||||
import org.jetbrains.kotlin.renderer.ClassifierNamePolicy
|
import org.jetbrains.kotlin.renderer.ClassifierNamePolicy
|
||||||
@@ -92,6 +91,9 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
if (element is KtDeclaration) {
|
if (element is KtDeclaration) {
|
||||||
return renderKotlinDeclaration(element, quickNavigation)
|
return renderKotlinDeclaration(element, quickNavigation)
|
||||||
}
|
}
|
||||||
|
else if (element is KtNameReferenceExpression && element.getReferencedName() == "it") {
|
||||||
|
return renderKotlinImplicitLambdaParameter(element, quickNavigation)
|
||||||
|
}
|
||||||
else if (element is KtLightDeclaration<*, *>) {
|
else if (element is KtLightDeclaration<*, *>) {
|
||||||
val origin = element.kotlinOrigin ?: return null
|
val origin = element.kotlinOrigin ?: return null
|
||||||
return renderKotlinDeclaration(origin, quickNavigation)
|
return renderKotlinDeclaration(origin, quickNavigation)
|
||||||
@@ -114,15 +116,25 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun renderKotlinDeclaration(declaration: KtDeclaration, quickNavigation: Boolean): String {
|
private fun renderKotlinDeclaration(declaration: KtExpression, quickNavigation: Boolean): String {
|
||||||
val context = declaration.analyze(BodyResolveMode.PARTIAL)
|
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) {
|
if (declarationDescriptor == null) {
|
||||||
LOG.info("Failed to find descriptor for declaration " + declaration.getElementTextWithContext())
|
LOG.info("Failed to find descriptor for declaration " + declaration.getElementTextWithContext())
|
||||||
return "No documentation available"
|
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) {
|
if (declarationDescriptor is ValueParameterDescriptor) {
|
||||||
val property = context[BindingContext.VALUE_PARAMETER_AS_PROPERTY, declarationDescriptor]
|
val property = context[BindingContext.VALUE_PARAMETER_AS_PROPERTY, declarationDescriptor]
|
||||||
if (property != null) {
|
if (property != null) {
|
||||||
@@ -132,7 +144,7 @@ class KotlinQuickDocumentationProvider : AbstractDocumentationProvider() {
|
|||||||
|
|
||||||
var renderedDecl = DESCRIPTOR_RENDERER.render(declarationDescriptor)
|
var renderedDecl = DESCRIPTOR_RENDERER.render(declarationDescriptor)
|
||||||
if (!quickNavigation) {
|
if (!quickNavigation) {
|
||||||
renderedDecl = "<pre>" + renderedDecl + "</pre>"
|
renderedDecl = "<pre>$renderedDecl</pre>"
|
||||||
}
|
}
|
||||||
val comment = declarationDescriptor.findKDoc()
|
val comment = declarationDescriptor.findKDoc()
|
||||||
if (comment != null) {
|
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.<anonymous>
|
||||||
+6
@@ -41,6 +41,12 @@ public class QuickDocProviderTestGenerated extends AbstractQuickDocProviderTest
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("AtTypeParameter.kt")
|
||||||
public void testAtTypeParameter() throws Exception {
|
public void testAtTypeParameter() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/AtTypeParameter.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/editor/quickDoc/AtTypeParameter.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user