KT-20884: Support receiver reference in KDoc comments
#KT-20884 fixed
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user