From aaf507121f84375c582aa37a90548b8a3a2583d6 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 2 Oct 2015 12:28:34 +0300 Subject: [PATCH] Refactored code: the same code for detection of callable reference type --- .../idea/completion/smart/SmartCompletion.kt | 4 +-- .../kotlin/idea/completion/smart/Utils.kt | 35 ++++--------------- 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt index 625090d3069..155f1d6bed3 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt @@ -318,9 +318,9 @@ class SmartCompletion( if (functionExpectedInfos.isEmpty()) return null fun toLookupElement(descriptor: FunctionDescriptor): LookupElement? { - val functionType = functionType(descriptor) ?: return null + val callableReferenceType = descriptor.callableReferenceType(resolutionFacade) ?: return null - val matchedExpectedInfos = functionExpectedInfos.filter { it.matchingSubstitutor(functionType) != null } + val matchedExpectedInfos = functionExpectedInfos.filter { it.matchingSubstitutor(callableReferenceType) != null } if (matchedExpectedInfos.isEmpty()) return null var lookupElement = lookupElementFactory.createLookupElement(descriptor, useReceiverTypes = false, parametersAndTypeGrayed = true) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt index caf1eed42b1..46e8ec5dd80 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt @@ -33,12 +33,11 @@ import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.callableReferences.getReflectionTypeForCandidateDescriptor -import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns -import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.typeUtil.TypeNullability import org.jetbrains.kotlin.types.typeUtil.isNothing import org.jetbrains.kotlin.util.descriptorsEqualWithSubstitution +import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList import java.util.* class ArtificialElementInsertHandler( @@ -238,30 +237,10 @@ private fun MutableCollection.addLookupElementsForNullable(factor } } -fun functionType(function: FunctionDescriptor): JetType? { - val extensionReceiverType = function.getExtensionReceiverParameter()?.getType() - val memberReceiverType = if (function is ConstructorDescriptor) { - val classDescriptor = function.getContainingDeclaration() - if (classDescriptor.isInner()) { - (classDescriptor.getContainingDeclaration() as? ClassifierDescriptor)?.getDefaultType() - } - else { - null - } - } - else { - (function.getContainingDeclaration() as? ClassifierDescriptor)?.getDefaultType() - } - //TODO: this is to be changed when references to member extensions supported - val receiverType = if (extensionReceiverType != null && memberReceiverType != null) - null - else - extensionReceiverType ?: memberReceiverType - return function.builtIns.getFunctionType( - function.getAnnotations(), receiverType, - function.getValueParameters().map { it.getType() }, - function.getReturnType() ?: return null - ) +fun CallableDescriptor.callableReferenceType(resolutionFacade: ResolutionFacade): FuzzyType? { + val type = getReflectionTypeForCandidateDescriptor(this, resolutionFacade.getFrontendService(ReflectionTypes::class.java)) ?: return null + //TODO: no generic + return FuzzyType(type, emptyList()/* references to generic functions not supported yet */) } fun LookupElementFactory.createLookupElementsInSmartCompletion( @@ -316,9 +295,7 @@ fun DeclarationDescriptor.fuzzyTypesForSmartCompletion( resolutionFacade: ResolutionFacade ): Collection { if (callType == CallType.CALLABLE_REFERENCE) { - if (this !is CallableDescriptor) return emptyList() - val type = getReflectionTypeForCandidateDescriptor(this, resolutionFacade.getFrontendService(ReflectionTypes::class.java)) ?: return emptyList() - return listOf(FuzzyType(type, emptyList()/* references to generic functions not supported yet */)) + return (this as? CallableDescriptor)?.callableReferenceType(resolutionFacade).singletonOrEmptyList() } if (this is CallableDescriptor) {