From 513376e5f04affe8d30fdce21f1ff59d81e4afed Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 20 Feb 2018 18:01:05 +0300 Subject: [PATCH] Introduce KtNamedFunction.resolveToDescriptorIfAny() --- .../org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt | 4 ++++ .../jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt | 2 +- .../kotlin/idea/run/KotlinRunConfigurationProducer.kt | 3 +-- .../jetbrains/kotlin/idea/goto/SearchEverywherePsiRenderer.kt | 3 +-- .../kotlin/idea/hierarchy/KotlinTypeHierarchyProvider.kt | 3 +-- .../kotlin/idea/highlighter/KotlinRunLineMarkerContributor.kt | 4 +--- .../idea/inspections/RedundantUnitReturnTypeInspection.kt | 3 +-- .../kotlin/idea/intentions/AddOperatorModifierIntention.kt | 3 +-- .../idea/intentions/ConvertFunctionToPropertyIntention.kt | 2 +- .../kotlin/idea/intentions/ConvertToBlockBodyIntention.kt | 3 +-- .../kotlin/idea/intentions/InvertIfConditionIntention.kt | 3 +-- .../kotlin/idea/intentions/ObjectLiteralToLambdaIntention.kt | 3 +-- .../kotlin/idea/quickfix/AddFunctionToSupertypeFix.kt | 3 +-- .../kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt | 2 +- .../changeSignature/KotlinChangeSignatureUsageProcessor.kt | 2 +- .../idea/nodejs/cli/KotlinNodeJsRunConfigurationProducer.kt | 2 +- 16 files changed, 19 insertions(+), 26 deletions(-) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt index 32a329e9606..30f51788b6c 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/caches/resolve/resolutionApi.kt @@ -69,6 +69,10 @@ fun KtClassOrObject.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = return (this as KtDeclaration).resolveToDescriptorIfAny(bodyResolveMode) as? ClassDescriptor } +fun KtNamedFunction.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): FunctionDescriptor? { + return (this as KtDeclaration).resolveToDescriptorIfAny(bodyResolveMode) as? FunctionDescriptor +} + fun KtParameter.resolveToParameterDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): ValueParameterDescriptor? { val context = analyze(bodyResolveMode) return context.get(BindingContext.VALUE_PARAMETER, this) as? ValueParameterDescriptor diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt index f0da18e9181..0e8c6947d6f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/IdeSampleResolutionService.kt @@ -104,7 +104,7 @@ private class GlobalSyntheticPackageViewDescriptor(override val fqName: FqName, .filter { it.isChildOf(fqName) } .filter { nameFilter(it.shortName()) } .flatMap { KotlinTopLevelFunctionFqnNameIndex.getInstance()[it.asString(), project, scope].asSequence() } - .map { it.resolveToDescriptorIfAny() } + .map { it.resolveToDescriptorIfAny() as? DeclarationDescriptor } fun getSubpackages(nameFilter: (Name) -> Boolean) = PackageIndexUtil.getSubPackageFqNames(fqName, scope, project, nameFilter) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationProducer.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationProducer.kt index a90fb15942e..d6cd43c9b7a 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationProducer.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/run/KotlinRunConfigurationProducer.kt @@ -27,7 +27,6 @@ import com.intellij.psi.util.ClassUtil import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.config.TargetPlatformKind -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny @@ -83,7 +82,7 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer) : DefaultPsi override fun getElementText(element: PsiElement?): String { if (element is KtNamedFunction) { - val descriptor = element.resolveToDescriptorIfAny() as? FunctionDescriptor + val descriptor = element.resolveToDescriptorIfAny() if (descriptor != null) { return buildString { descriptor.extensionReceiverParameter?.let { append(RENDERER.renderType(it.type)).append('.') } diff --git a/idea/src/org/jetbrains/kotlin/idea/hierarchy/KotlinTypeHierarchyProvider.kt b/idea/src/org/jetbrains/kotlin/idea/hierarchy/KotlinTypeHierarchyProvider.kt index 29501fcfc61..af92539d189 100644 --- a/idea/src/org/jetbrains/kotlin/idea/hierarchy/KotlinTypeHierarchyProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/hierarchy/KotlinTypeHierarchyProvider.kt @@ -28,7 +28,6 @@ import com.intellij.psi.* import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.config.TargetPlatformKind -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.lightClasses.KtFakeLightClass import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.project.targetPlatform @@ -70,7 +69,7 @@ class KotlinTypeHierarchyProvider : JavaTypeHierarchyProvider() { is KtClassOrObject -> getOriginalPsiClassOrCreateLightClass(target, module) is KtNamedFunction -> { // Factory methods val functionName = target.name - val functionDescriptor = target.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? FunctionDescriptor ?: return null + val functionDescriptor = target.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return null val type = functionDescriptor.returnType ?: return null val returnTypeText = DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(type) if (returnTypeText != functionName) return null diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRunLineMarkerContributor.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRunLineMarkerContributor.kt index 892a317bf08..c5511b9af98 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRunLineMarkerContributor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/KotlinRunLineMarkerContributor.kt @@ -20,8 +20,6 @@ import com.intellij.execution.lineMarker.ExecutorAction import com.intellij.execution.lineMarker.RunLineMarkerContributor import com.intellij.icons.AllIcons import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.idea.KotlinIcons import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.psi.KtNamedFunction @@ -34,7 +32,7 @@ class KotlinRunLineMarkerContributor : RunLineMarkerContributor() { if (function.nameIdentifier != element) return null val detector = MainFunctionDetector { someFunction -> - someFunction.resolveToDescriptorIfAny() as? FunctionDescriptor + someFunction.resolveToDescriptorIfAny() } if (detector.isMain(function)) { diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantUnitReturnTypeInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantUnitReturnTypeInspection.kt index 58e5314d5bb..321258c17f9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantUnitReturnTypeInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantUnitReturnTypeInspection.kt @@ -10,7 +10,6 @@ import com.intellij.codeInspection.IntentionWrapper import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemsHolder import com.intellij.psi.PsiElementVisitor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.intentions.RemoveExplicitTypeIntention import org.jetbrains.kotlin.psi.KtCodeFragment @@ -22,7 +21,7 @@ class RedundantUnitReturnTypeInspection : AbstractKotlinInspection(), CleanupLoc return namedFunctionVisitor(fun(function) { if (function.containingFile is KtCodeFragment) return val typeElement = function.typeReference?.typeElement ?: return - val descriptor = function.resolveToDescriptorIfAny() as? FunctionDescriptor ?: return + val descriptor = function.resolveToDescriptorIfAny() ?: return if (descriptor.returnType?.isUnit() == true) { if (!function.hasBlockBody()) { return diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/AddOperatorModifierIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/AddOperatorModifierIntention.kt index 223f419d2d1..6577e02fce5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/AddOperatorModifierIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/AddOperatorModifierIntention.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor import com.intellij.openapi.util.TextRange -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.refactoring.withExpectedActuals import org.jetbrains.kotlin.lexer.KtTokens @@ -28,7 +27,7 @@ import org.jetbrains.kotlin.util.OperatorChecks class AddOperatorModifierIntention : SelfTargetingRangeIntention(KtNamedFunction::class.java, "Add 'operator' modifier") { override fun applicabilityRange(element: KtNamedFunction): TextRange? { val nameIdentifier = element.nameIdentifier ?: return null - val functionDescriptor = element.resolveToDescriptorIfAny() as? FunctionDescriptor ?: return null + val functionDescriptor = element.resolveToDescriptorIfAny() ?: return null if (functionDescriptor.isOperator || !OperatorChecks.check(functionDescriptor).isSuccess) return null return nameIdentifier.textRange } diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertFunctionToPropertyIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertFunctionToPropertyIntention.kt index df375f801ed..c5e25236889 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertFunctionToPropertyIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertFunctionToPropertyIntention.kt @@ -210,7 +210,7 @@ class ConvertFunctionToPropertyIntention : SelfTargetingIntention(KtIfEx is KtNamedFunction -> { if (parent.bodyExpression == expression) { if (!parent.hasBlockBody()) return null - val returnType = (parent.resolveToDescriptorIfAny() as? FunctionDescriptor)?.returnType + val returnType = parent.resolveToDescriptorIfAny()?.returnType if (returnType == null || !returnType.isUnit()) return null return KtPsiFactory(expression).createExpression("return") } diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ObjectLiteralToLambdaIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ObjectLiteralToLambdaIntention.kt index b079e3f7584..380cac698fa 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ObjectLiteralToLambdaIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ObjectLiteralToLambdaIntention.kt @@ -22,7 +22,6 @@ import com.intellij.psi.PsiComment import com.intellij.psi.search.LocalSearchScope import com.intellij.psi.search.searches.ReferencesSearch import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny @@ -61,7 +60,7 @@ class ObjectLiteralToLambdaIntention : SelfTargetingRangeIntention { - val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? FunctionDescriptor - ?: return emptyList() + val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return emptyList() val containingClass = functionDescriptor.containingDeclaration as? ClassDescriptor ?: return emptyList() diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt index 320e7324d5d..418aa193e0b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeMemberFunctionSignatureFix.kt @@ -100,7 +100,7 @@ class ChangeMemberFunctionSignatureFix private constructor( return emptyList() } - val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? FunctionDescriptor + val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return emptyList() val superFunctions = getPossibleSuperFunctionsDescriptors(functionDescriptor) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt index 48deb2f5eb9..7ec9f36cfe9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt @@ -440,7 +440,7 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor { for (overridingMethod in OverridingMethodsSearch.search(method)) { val unwrappedElement = overridingMethod.namedUnwrappedElement as? KtNamedFunction ?: continue - val functionDescriptor = unwrappedElement.resolveToDescriptorIfAny() as? FunctionDescriptor ?: continue + val functionDescriptor = unwrappedElement.resolveToDescriptorIfAny() ?: continue result.add(DeferredJavaMethodOverrideOrSAMUsage(unwrappedElement, functionDescriptor, null)) findDeferredUsagesOfParameters(changeInfo, result, unwrappedElement, functionDescriptor) } diff --git a/ultimate/src/org/jetbrains/kotlin/idea/nodejs/cli/KotlinNodeJsRunConfigurationProducer.kt b/ultimate/src/org/jetbrains/kotlin/idea/nodejs/cli/KotlinNodeJsRunConfigurationProducer.kt index 25b2246a4d6..75adce2e4c4 100644 --- a/ultimate/src/org/jetbrains/kotlin/idea/nodejs/cli/KotlinNodeJsRunConfigurationProducer.kt +++ b/ultimate/src/org/jetbrains/kotlin/idea/nodejs/cli/KotlinNodeJsRunConfigurationProducer.kt @@ -44,7 +44,7 @@ private class KotlinNodeJsRunConfigurationProducer : val project = psiFile.project if (psiElement is KtNamedFunction) { - val detector = MainFunctionDetector { it.resolveToDescriptorIfAny() as? FunctionDescriptor } + val detector = MainFunctionDetector { it.resolveToDescriptorIfAny() } if (!detector.isMain(psiElement, false)) return false } else if (!TestElementPath.isModuleAssociatedDir(psiElement, jsModule)) return false