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.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.synthetic.SyntheticMemberDescriptor
|
||||||
import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||||
|
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver
|
||||||
import org.jetbrains.kotlin.resolve.source.getPsi
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -51,7 +53,20 @@ object DescriptorToSourceUtils {
|
|||||||
return result
|
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? {
|
@JvmStatic fun getSourceFromDescriptor(descriptor: DeclarationDescriptor): PsiElement? {
|
||||||
|
if (descriptor is ReceiverParameterDescriptor) {
|
||||||
|
getSourceForExtensionReceiverParameterDescriptor(descriptor)?.let { return it }
|
||||||
|
}
|
||||||
|
|
||||||
return (descriptor as? DeclarationDescriptorWithSource)?.source?.getPsi()
|
return (descriptor as? DeclarationDescriptorWithSource)?.source?.getPsi()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -119,6 +119,10 @@ private fun resolveDefaultKDocLink(
|
|||||||
descriptorsByName.addAll(contextScope.collectFunctions(shortName, NoLookupLocation.FROM_IDE))
|
descriptorsByName.addAll(contextScope.collectFunctions(shortName, NoLookupLocation.FROM_IDE))
|
||||||
descriptorsByName.addAll(contextScope.collectVariables(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
|
// Try to find a matching local descriptor (parameter or type parameter) first
|
||||||
val localDescriptors = descriptorsByName.filter { it.containingDeclaration == fromDescriptor }
|
val localDescriptors = descriptorsByName.filter { it.containingDeclaration == fromDescriptor }
|
||||||
if (localDescriptors.isNotEmpty()) return localDescriptors
|
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);
|
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")
|
@TestMetadata("SeeReference.kt")
|
||||||
public void testSeeReference() throws Exception {
|
public void testSeeReference() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/kdoc/resolve/SeeReference.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/kdoc/resolve/SeeReference.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user