Code improvements

This commit is contained in:
Valentin Kipyatkov
2020-03-26 15:15:57 +02:00
parent 88cd129549
commit e49ca20d17
@@ -40,7 +40,9 @@ class KotlinParameterInfo @JvmOverloads constructor(
) : ParameterInfo { ) : ParameterInfo {
var currentTypeInfo: KotlinTypeInfo = originalTypeInfo var currentTypeInfo: KotlinTypeInfo = originalTypeInfo
val defaultValueParameterReferences: Map<PsiReference, DeclarationDescriptor> by lazy { collectDefaultValueParameterReferences(defaultValueForCall) } val defaultValueParameterReferences: Map<PsiReference, DeclarationDescriptor> by lazy {
collectDefaultValueParameterReferences(defaultValueForCall)
}
private fun collectDefaultValueParameterReferences(defaultValueForCall: KtExpression?): Map<PsiReference, DeclarationDescriptor> { private fun collectDefaultValueParameterReferences(defaultValueForCall: KtExpression?): Map<PsiReference, DeclarationDescriptor> {
val file = defaultValueForCall?.containingFile as? KtFile ?: return emptyMap() val file = defaultValueForCall?.containingFile as? KtFile ?: return emptyMap()
@@ -51,43 +53,48 @@ class KotlinParameterInfo @JvmOverloads constructor(
defaultValueForCall.accept( defaultValueForCall.accept(
object : KtTreeVisitorVoid() { object : KtTreeVisitorVoid() {
private fun selfParameterOrNull(parameter: DeclarationDescriptor?): ValueParameterDescriptor? { private fun compareDescriptors(currentDescriptor: DeclarationDescriptor?, originalDescriptor: DeclarationDescriptor?): Boolean {
return compareDescriptors(project, currentDescriptor, originalDescriptor)
}
private fun takeIfParameterOfSelf(parameter: DeclarationDescriptor?): ValueParameterDescriptor? {
return (parameter as? ValueParameterDescriptor) return (parameter as? ValueParameterDescriptor)
?.takeIf { compareDescriptors(project, parameter.containingDeclaration, callableDescriptor) } ?.takeIf { compareDescriptors(it.containingDeclaration, callableDescriptor) }
} }
private fun selfReceiverOrNull(receiverDescriptor: DeclarationDescriptor?): DeclarationDescriptor? { private fun takeIfReceiverOfSelf(receiverDescriptor: DeclarationDescriptor?): DeclarationDescriptor? {
if (compareDescriptors(project, receiverDescriptor, callableDescriptor.extensionReceiverParameter?.containingDeclaration)) { return receiverDescriptor?.takeIf {
return receiverDescriptor compareDescriptors(it, callableDescriptor.extensionReceiverParameter?.containingDeclaration)
|| compareDescriptors(it, callableDescriptor.dispatchReceiverParameter?.containingDeclaration)
} }
if (compareDescriptors(project, receiverDescriptor, callableDescriptor.dispatchReceiverParameter?.containingDeclaration)) {
return receiverDescriptor
}
return null
} }
private fun selfReceiverOrNull(receiver: ImplicitReceiver?): DeclarationDescriptor? { private fun takeIfReceiverOfSelf(receiver: ImplicitReceiver?): DeclarationDescriptor? {
return selfReceiverOrNull(receiver?.declarationDescriptor) return takeIfReceiverOfSelf(receiver?.declarationDescriptor)
} }
private fun getRelevantDescriptor(expression: KtSimpleNameExpression, ref: KtReference): DeclarationDescriptor? { private fun getRelevantDescriptor(expression: KtSimpleNameExpression, ref: KtReference): DeclarationDescriptor? {
val context = expression.analyze(BodyResolveMode.PARTIAL) val context = expression.analyze(BodyResolveMode.PARTIAL)
val descriptor = ref.resolveToDescriptors(context).singleOrNull() val descriptor = ref.resolveToDescriptors(context).singleOrNull()
if (descriptor is ValueParameterDescriptor) return selfParameterOrNull(descriptor) if (descriptor is ValueParameterDescriptor) {
return takeIfParameterOfSelf(descriptor)
}
if (descriptor is PropertyDescriptor && callableDescriptor is ConstructorDescriptor) { if (descriptor is PropertyDescriptor && callableDescriptor is ConstructorDescriptor) {
val parameter = DescriptorToSourceUtils.getSourceFromDescriptor(descriptor) as? KtParameter val parameter = DescriptorToSourceUtils.getSourceFromDescriptor(descriptor)
return parameter?.let { selfParameterOrNull(context[BindingContext.VALUE_PARAMETER, it]) } if (parameter is KtParameter) {
return takeIfParameterOfSelf(context[BindingContext.VALUE_PARAMETER, parameter])
}
} }
val resolvedCall = expression.getResolvedCall(context) ?: return null val resolvedCall = expression.getResolvedCall(context) ?: return null
(resolvedCall.resultingDescriptor as? ReceiverParameterDescriptor)?.let { (resolvedCall.resultingDescriptor as? ReceiverParameterDescriptor)?.let {
return if (selfReceiverOrNull(it.containingDeclaration) != null) it else null return if (takeIfReceiverOfSelf(it.containingDeclaration) != null) it else null
} }
selfReceiverOrNull(resolvedCall.extensionReceiver as? ImplicitReceiver)?.let { return it } takeIfReceiverOfSelf(resolvedCall.extensionReceiver as? ImplicitReceiver)?.let { return it }
selfReceiverOrNull(resolvedCall.dispatchReceiver as? ImplicitReceiver)?.let { return it } takeIfReceiverOfSelf(resolvedCall.dispatchReceiver as? ImplicitReceiver)?.let { return it }
return null return null
} }