KT-20884: Support receiver reference in KDoc comments

#KT-20884 fixed
This commit is contained in:
Simon Ogorodnik
2017-10-23 05:21:37 +03:00
parent 94e39a4c6c
commit 98310d3bdb
4 changed files with 33 additions and 0 deletions
@@ -23,7 +23,9 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZE
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor
import org.jetbrains.kotlin.psi.KtAnnotationEntry
import org.jetbrains.kotlin.psi.KtCallableDeclaration
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver
import org.jetbrains.kotlin.resolve.source.getPsi
import java.util.*
@@ -51,7 +53,20 @@ object DescriptorToSourceUtils {
return result
}
// TODO Fix in descriptor
@JvmStatic private fun getSourceForExtensionReceiverParameterDescriptor(descriptor: ReceiverParameterDescriptor): PsiElement? {
// Only for extension receivers
if (descriptor.source != SourceElement.NO_SOURCE || descriptor.value !is ExtensionReceiver) return null
val containingDeclaration = descriptor.containingDeclaration as? CallableDescriptor ?: return null
val psi = containingDeclaration.source.getPsi() as? KtCallableDeclaration ?: return null
return psi.receiverTypeReference
}
@JvmStatic fun getSourceFromDescriptor(descriptor: DeclarationDescriptor): PsiElement? {
if (descriptor is ReceiverParameterDescriptor) {
getSourceForExtensionReceiverParameterDescriptor(descriptor)?.let { return it }
}
return (descriptor as? DeclarationDescriptorWithSource)?.source?.getPsi()
}
@@ -119,6 +119,10 @@ private fun resolveDefaultKDocLink(
descriptorsByName.addAll(contextScope.collectFunctions(shortName, NoLookupLocation.FROM_IDE))
descriptorsByName.addAll(contextScope.collectVariables(shortName, NoLookupLocation.FROM_IDE))
if (fromDescriptor is FunctionDescriptor && fromDescriptor.isExtension && shortName.asString() == "this") {
return listOfNotNull(fromDescriptor.extensionReceiverParameter)
}
// Try to find a matching local descriptor (parameter or type parameter) first
val localDescriptors = descriptorsByName.filter { it.containingDeclaration == fromDescriptor }
if (localDescriptors.isNotEmpty()) return localDescriptors
+8
View File
@@ -0,0 +1,8 @@
class Foo
/**
* [<caret>this]
*/
fun Foo.bar {}
// REF: Foo
@@ -157,6 +157,12 @@ public class KdocResolveTestGenerated extends AbstractReferenceResolveTest {
doTest(fileName);
}
@TestMetadata("ReceiverReference.kt")
public void testReceiverReference() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/kdoc/resolve/ReceiverReference.kt");
doTest(fileName);
}
@TestMetadata("SeeReference.kt")
public void testSeeReference() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/kdoc/resolve/SeeReference.kt");