Introduce KtNamedFunction.resolveToDescriptorIfAny()

This commit is contained in:
Mikhail Glukhikh
2018-02-20 18:01:05 +03:00
parent 5848bc9a44
commit 513376e5f0
16 changed files with 19 additions and 26 deletions
@@ -20,7 +20,6 @@ import com.intellij.ide.util.DefaultPsiElementCellRenderer
import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiElement
import com.intellij.psi.presentation.java.SymbolPresentationUtil
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.psi.KtNamedFunction
@@ -37,7 +36,7 @@ class KotlinSearchEverywherePsiRenderer(private val list: JList<*>) : 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('.') }
@@ -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
@@ -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)) {
@@ -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
@@ -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>(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
}
@@ -210,7 +210,7 @@ class ConvertFunctionToPropertyIntention : SelfTargetingIntention<KtNamedFunctio
return false
}
val descriptor = element.resolveToDescriptorIfAny() as? FunctionDescriptor ?: return false
val descriptor = element.resolveToDescriptorIfAny() ?: return false
val returnType = descriptor.returnType ?: return false
return !KotlinBuiltIns.isUnit(returnType) && !KotlinBuiltIns.isNothing(returnType)
}
@@ -20,7 +20,6 @@ import com.intellij.codeInsight.intention.LowPriorityAction
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.setType
@@ -101,7 +100,7 @@ class ConvertToBlockBodyIntention : SelfTargetingIntention<KtDeclarationWithBody
private fun KtNamedFunction.returnType(): KotlinType? {
val descriptor = resolveToDescriptorIfAny() ?: return null
return (descriptor as FunctionDescriptor).returnType
return descriptor.returnType
}
}
}
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.intentions
import com.intellij.openapi.editor.Editor
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.moveCaret
import org.jetbrains.kotlin.idea.core.replaced
@@ -212,7 +211,7 @@ class InvertIfConditionIntention : SelfTargetingIntention<KtIfExpression>(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")
}
@@ -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<KtObjectLiter
if (!SingleAbstractMethodUtils.isSamType(baseType)) return null
val functionDescriptor = singleFunction.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? FunctionDescriptor ?: return null
val functionDescriptor = singleFunction.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return null
val overridden = functionDescriptor.overriddenDescriptors.singleOrNull() ?: return null
if (overridden.modality != Modality.ABSTRACT) return null
@@ -158,8 +158,7 @@ class AddFunctionToSupertypeFix private constructor(
}
private fun generateFunctionsToAdd(functionElement: KtNamedFunction): List<FunctionDescriptor> {
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()
@@ -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)
@@ -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)
}