Introduce KtNamedFunction.resolveToDescriptorIfAny()
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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<KotlinRunConfigu
|
||||
val psiFile = locationElement.containingFile
|
||||
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)
|
||||
while (currentElement != null) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user