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
@@ -69,6 +69,10 @@ fun KtClassOrObject.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode =
return (this as KtDeclaration).resolveToDescriptorIfAny(bodyResolveMode) as? ClassDescriptor 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? { fun KtParameter.resolveToParameterDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): ValueParameterDescriptor? {
val context = analyze(bodyResolveMode) val context = analyze(bodyResolveMode)
return context.get(BindingContext.VALUE_PARAMETER, this) as? ValueParameterDescriptor return context.get(BindingContext.VALUE_PARAMETER, this) as? ValueParameterDescriptor
@@ -104,7 +104,7 @@ private class GlobalSyntheticPackageViewDescriptor(override val fqName: FqName,
.filter { it.isChildOf(fqName) } .filter { it.isChildOf(fqName) }
.filter { nameFilter(it.shortName()) } .filter { nameFilter(it.shortName()) }
.flatMap { KotlinTopLevelFunctionFqnNameIndex.getInstance()[it.asString(), project, scope].asSequence() } .flatMap { KotlinTopLevelFunctionFqnNameIndex.getInstance()[it.asString(), project, scope].asSequence() }
.map { it.resolveToDescriptorIfAny() } .map { it.resolveToDescriptorIfAny() as? DeclarationDescriptor }
fun getSubpackages(nameFilter: (Name) -> Boolean) = fun getSubpackages(nameFilter: (Name) -> Boolean) =
PackageIndexUtil.getSubPackageFqNames(fqName, scope, project, nameFilter) PackageIndexUtil.getSubPackageFqNames(fqName, scope, project, nameFilter)
@@ -27,7 +27,6 @@ import com.intellij.psi.util.ClassUtil
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.config.TargetPlatformKind import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName
import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
@@ -83,7 +82,7 @@ class KotlinRunConfigurationProducer : RunConfigurationProducer<KotlinRunConfigu
val psiFile = locationElement.containingFile val psiFile = locationElement.containingFile
if (!(psiFile is KtFile && ProjectRootsUtil.isInProjectOrLibSource(psiFile))) return null if (!(psiFile is KtFile && ProjectRootsUtil.isInProjectOrLibSource(psiFile))) return null
val mainFunctionDetector = MainFunctionDetector { it.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? FunctionDescriptor } val mainFunctionDetector = MainFunctionDetector { it.resolveToDescriptorIfAny(BodyResolveMode.FULL) }
var currentElement = locationElement.declarationContainer(false) var currentElement = locationElement.declarationContainer(false)
while (currentElement != null) { while (currentElement != null) {
@@ -20,7 +20,6 @@ import com.intellij.ide.util.DefaultPsiElementCellRenderer
import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.presentation.java.SymbolPresentationUtil 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.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
@@ -37,7 +36,7 @@ class KotlinSearchEverywherePsiRenderer(private val list: JList<*>) : DefaultPsi
override fun getElementText(element: PsiElement?): String { override fun getElementText(element: PsiElement?): String {
if (element is KtNamedFunction) { if (element is KtNamedFunction) {
val descriptor = element.resolveToDescriptorIfAny() as? FunctionDescriptor val descriptor = element.resolveToDescriptorIfAny()
if (descriptor != null) { if (descriptor != null) {
return buildString { return buildString {
descriptor.extensionReceiverParameter?.let { append(RENDERER.renderType(it.type)).append('.') } descriptor.extensionReceiverParameter?.let { append(RENDERER.renderType(it.type)).append('.') }
@@ -28,7 +28,6 @@ import com.intellij.psi.*
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.config.TargetPlatformKind 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.lightClasses.KtFakeLightClass
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.project.targetPlatform import org.jetbrains.kotlin.idea.project.targetPlatform
@@ -70,7 +69,7 @@ class KotlinTypeHierarchyProvider : JavaTypeHierarchyProvider() {
is KtClassOrObject -> getOriginalPsiClassOrCreateLightClass(target, module) is KtClassOrObject -> getOriginalPsiClassOrCreateLightClass(target, module)
is KtNamedFunction -> { // Factory methods is KtNamedFunction -> { // Factory methods
val functionName = target.name 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 type = functionDescriptor.returnType ?: return null
val returnTypeText = DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(type) val returnTypeText = DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(type)
if (returnTypeText != functionName) return null if (returnTypeText != functionName) return null
@@ -20,8 +20,6 @@ import com.intellij.execution.lineMarker.ExecutorAction
import com.intellij.execution.lineMarker.RunLineMarkerContributor import com.intellij.execution.lineMarker.RunLineMarkerContributor
import com.intellij.icons.AllIcons import com.intellij.icons.AllIcons
import com.intellij.psi.PsiElement 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.MainFunctionDetector
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
@@ -34,7 +32,7 @@ class KotlinRunLineMarkerContributor : RunLineMarkerContributor() {
if (function.nameIdentifier != element) return null if (function.nameIdentifier != element) return null
val detector = MainFunctionDetector { someFunction -> val detector = MainFunctionDetector { someFunction ->
someFunction.resolveToDescriptorIfAny() as? FunctionDescriptor someFunction.resolveToDescriptorIfAny()
} }
if (detector.isMain(function)) { if (detector.isMain(function)) {
@@ -10,7 +10,6 @@ import com.intellij.codeInspection.IntentionWrapper
import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.ProblemsHolder import com.intellij.codeInspection.ProblemsHolder
import com.intellij.psi.PsiElementVisitor import com.intellij.psi.PsiElementVisitor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.intentions.RemoveExplicitTypeIntention import org.jetbrains.kotlin.idea.intentions.RemoveExplicitTypeIntention
import org.jetbrains.kotlin.psi.KtCodeFragment import org.jetbrains.kotlin.psi.KtCodeFragment
@@ -22,7 +21,7 @@ class RedundantUnitReturnTypeInspection : AbstractKotlinInspection(), CleanupLoc
return namedFunctionVisitor(fun(function) { return namedFunctionVisitor(fun(function) {
if (function.containingFile is KtCodeFragment) return if (function.containingFile is KtCodeFragment) return
val typeElement = function.typeReference?.typeElement ?: 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 (descriptor.returnType?.isUnit() == true) {
if (!function.hasBlockBody()) { if (!function.hasBlockBody()) {
return return
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.intentions
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import com.intellij.openapi.util.TextRange 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.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.refactoring.withExpectedActuals import org.jetbrains.kotlin.idea.refactoring.withExpectedActuals
import org.jetbrains.kotlin.lexer.KtTokens 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") { class AddOperatorModifierIntention : SelfTargetingRangeIntention<KtNamedFunction>(KtNamedFunction::class.java, "Add 'operator' modifier") {
override fun applicabilityRange(element: KtNamedFunction): TextRange? { override fun applicabilityRange(element: KtNamedFunction): TextRange? {
val nameIdentifier = element.nameIdentifier ?: return null 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 if (functionDescriptor.isOperator || !OperatorChecks.check(functionDescriptor).isSuccess) return null
return nameIdentifier.textRange return nameIdentifier.textRange
} }
@@ -210,7 +210,7 @@ class ConvertFunctionToPropertyIntention : SelfTargetingIntention<KtNamedFunctio
return false return false
} }
val descriptor = element.resolveToDescriptorIfAny() as? FunctionDescriptor ?: return false val descriptor = element.resolveToDescriptorIfAny() ?: return false
val returnType = descriptor.returnType ?: return false val returnType = descriptor.returnType ?: return false
return !KotlinBuiltIns.isUnit(returnType) && !KotlinBuiltIns.isNothing(returnType) 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.openapi.editor.Editor
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.CallableDescriptor 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.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.setType import org.jetbrains.kotlin.idea.core.setType
@@ -101,7 +100,7 @@ class ConvertToBlockBodyIntention : SelfTargetingIntention<KtDeclarationWithBody
private fun KtNamedFunction.returnType(): KotlinType? { private fun KtNamedFunction.returnType(): KotlinType? {
val descriptor = resolveToDescriptorIfAny() ?: return null 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.openapi.editor.Editor
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.core.moveCaret
import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.core.replaced
@@ -212,7 +211,7 @@ class InvertIfConditionIntention : SelfTargetingIntention<KtIfExpression>(KtIfEx
is KtNamedFunction -> { is KtNamedFunction -> {
if (parent.bodyExpression == expression) { if (parent.bodyExpression == expression) {
if (!parent.hasBlockBody()) return null if (!parent.hasBlockBody()) return null
val returnType = (parent.resolveToDescriptorIfAny() as? FunctionDescriptor)?.returnType val returnType = parent.resolveToDescriptorIfAny()?.returnType
if (returnType == null || !returnType.isUnit()) return null if (returnType == null || !returnType.isUnit()) return null
return KtPsiFactory(expression).createExpression("return") 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.LocalSearchScope
import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.psi.search.searches.ReferencesSearch
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
@@ -61,7 +60,7 @@ class ObjectLiteralToLambdaIntention : SelfTargetingRangeIntention<KtObjectLiter
if (!SingleAbstractMethodUtils.isSamType(baseType)) return null 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 val overridden = functionDescriptor.overriddenDescriptors.singleOrNull() ?: return null
if (overridden.modality != Modality.ABSTRACT) return null if (overridden.modality != Modality.ABSTRACT) return null
@@ -158,8 +158,7 @@ class AddFunctionToSupertypeFix private constructor(
} }
private fun generateFunctionsToAdd(functionElement: KtNamedFunction): List<FunctionDescriptor> { private fun generateFunctionsToAdd(functionElement: KtNamedFunction): List<FunctionDescriptor> {
val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? FunctionDescriptor val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return emptyList()
?: return emptyList()
val containingClass = functionDescriptor.containingDeclaration as? ClassDescriptor ?: return emptyList() val containingClass = functionDescriptor.containingDeclaration as? ClassDescriptor ?: return emptyList()
@@ -100,7 +100,7 @@ class ChangeMemberFunctionSignatureFix private constructor(
return emptyList() return emptyList()
} }
val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? FunctionDescriptor val functionDescriptor = functionElement.resolveToDescriptorIfAny(BodyResolveMode.FULL)
?: return emptyList() ?: return emptyList()
val superFunctions = getPossibleSuperFunctionsDescriptors(functionDescriptor) val superFunctions = getPossibleSuperFunctionsDescriptors(functionDescriptor)
@@ -440,7 +440,7 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor {
for (overridingMethod in OverridingMethodsSearch.search(method)) { for (overridingMethod in OverridingMethodsSearch.search(method)) {
val unwrappedElement = overridingMethod.namedUnwrappedElement as? KtNamedFunction ?: continue 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)) result.add(DeferredJavaMethodOverrideOrSAMUsage(unwrappedElement, functionDescriptor, null))
findDeferredUsagesOfParameters(changeInfo, result, unwrappedElement, functionDescriptor) findDeferredUsagesOfParameters(changeInfo, result, unwrappedElement, functionDescriptor)
} }
@@ -44,7 +44,7 @@ private class KotlinNodeJsRunConfigurationProducer :
val project = psiFile.project val project = psiFile.project
if (psiElement is KtNamedFunction) { if (psiElement is KtNamedFunction) {
val detector = MainFunctionDetector { it.resolveToDescriptorIfAny() as? FunctionDescriptor } val detector = MainFunctionDetector { it.resolveToDescriptorIfAny() }
if (!detector.isMain(psiElement, false)) return false if (!detector.isMain(psiElement, false)) return false
} }
else if (!TestElementPath.isModuleAssociatedDir(psiElement, jsModule)) return false else if (!TestElementPath.isModuleAssociatedDir(psiElement, jsModule)) return false