From f6513cd17e57ec5bf504ab80591b58ff04f8444f Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 20 Feb 2018 17:43:06 +0300 Subject: [PATCH] Introduce resolveToParameterDescriptorIfAny(), drop reified version --- .../idea/caches/resolve/resolutionApi.kt | 21 ++++++++----------- .../kotlin/idea/search/usagesSearch/utils.kt | 5 +++-- .../kotlin/idea/patterns/KotlinPatterns.kt | 3 ++- .../RemoveUnusedFunctionParameterFix.kt | 5 ++--- ...nameParameterToMatchOverriddenMethodFix.kt | 6 ++---- .../idea/quickfix/SuperClassNotInitialized.kt | 3 ++- .../jetbrains/kotlin/idea/slicer/Slicer.kt | 2 +- 7 files changed, 21 insertions(+), 24 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 432f9e2b50e..9606062c05d 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 @@ -57,23 +57,20 @@ fun KtDeclaration.unsafeResolveToDescriptor(bodyResolveMode: BodyResolveMode = B * and then takes the relevant descriptor from binding context. * The exact set of declarations to resolve depends on bodyResolveMode */ -inline fun KtDeclaration.resolveToDescriptorIfAny( - bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL, - klass: Class = D::class.java -): D? { +fun KtDeclaration.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): DeclarationDescriptor? { //TODO: BodyResolveMode.PARTIAL is not quite safe! val context = analyze(bodyResolveMode) - if (this is KtParameter && this.hasValOrVar() && klass != ValueParameterDescriptor::class.java) { - return context.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this) as? D + return if (this is KtParameter && hasValOrVar()) { + context.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this) + } else { + context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, this) } - return context.get(BindingContext.DECLARATION_TO_DESCRIPTOR, this) as? D } -fun KtDeclaration.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL) = - resolveToDescriptorIfAny(bodyResolveMode) - -fun KtParameter.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL) = - resolveToDescriptorIfAny(bodyResolveMode) +fun KtParameter.resolveToParameterDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): ValueParameterDescriptor? { + val context = analyze(bodyResolveMode) + return context.get(BindingContext.VALUE_PARAMETER, this) as? ValueParameterDescriptor +} fun KtFile.resolveImportReference(fqName: FqName): Collection { val facade = getResolutionFacade() diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/utils.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/utils.kt index eac394515e9..aa9046cc7c0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/utils.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/utils.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getJavaMethodDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.caches.resolve.resolveToParameterDescriptorIfAny import org.jetbrains.kotlin.idea.references.unwrappedTargets import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchRequest import org.jetbrains.kotlin.idea.search.declarationsSearch.searchInheritors @@ -60,10 +61,10 @@ val KtDeclaration.constructor: ConstructorDescriptor? } val KtParameter.descriptor: ValueParameterDescriptor? - get() = this.resolveToDescriptorIfAny(BodyResolveMode.FULL) + get() = this.resolveToParameterDescriptorIfAny(BodyResolveMode.FULL) val KtParameter.propertyDescriptor: PropertyDescriptor? - get() = this.resolveToDescriptorIfAny(BodyResolveMode.FULL) + get() = this.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? PropertyDescriptor fun PsiReference.checkUsageVsOriginalDescriptor( targetDescriptor: DeclarationDescriptor, diff --git a/idea/src/org/jetbrains/kotlin/idea/patterns/KotlinPatterns.kt b/idea/src/org/jetbrains/kotlin/idea/patterns/KotlinPatterns.kt index 002118de064..a018cd52a77 100644 --- a/idea/src/org/jetbrains/kotlin/idea/patterns/KotlinPatterns.kt +++ b/idea/src/org/jetbrains/kotlin/idea/patterns/KotlinPatterns.kt @@ -23,6 +23,7 @@ import com.intellij.util.ProcessingContext import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.caches.resolve.resolveToParameterDescriptorIfAny import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtParameter @@ -119,7 +120,7 @@ class KtParameterPattern : PsiElementPattern(Kt return withPatternCondition("KtParameterPattern-withAnnotation") { ktParameter, _ -> if (ktParameter.annotationEntries.isEmpty()) return@withPatternCondition false - val parameterDescriptor = ktParameter.resolveToDescriptorIfAny() + val parameterDescriptor = ktParameter.resolveToParameterDescriptorIfAny() parameterDescriptor is ValueParameterDescriptor && parameterDescriptor.annotations.any { annotation -> annotation.fqName?.asString() == fqName } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt index 573e6612676..0e7830b5d1b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt @@ -18,10 +18,9 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors -import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.caches.resolve.resolveToParameterDescriptorIfAny import org.jetbrains.kotlin.idea.intentions.RemoveEmptyPrimaryConstructorIntention import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.psi.* @@ -40,7 +39,7 @@ class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixA val element = element ?: return val primaryConstructor = element.parent?.parent as? KtPrimaryConstructor val parameterList = element.parent as? KtParameterList - val parameterDescriptor = element.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return + val parameterDescriptor = element.resolveToParameterDescriptorIfAny(BodyResolveMode.FULL) ?: return ChangeFunctionSignatureFix.runRemoveParameter(parameterDescriptor, element) val nextParameter = parameterList?.parameters?.getOrNull(parameterDescriptor.index) if (nextParameter != null) { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameParameterToMatchOverriddenMethodFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameParameterToMatchOverriddenMethodFix.kt index ca6c2bafccd..bb7b0f5b4c1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameParameterToMatchOverriddenMethodFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameParameterToMatchOverriddenMethodFix.kt @@ -20,9 +20,8 @@ import com.intellij.codeInsight.intention.IntentionAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.refactoring.rename.RenameProcessor -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic -import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.caches.resolve.resolveToParameterDescriptorIfAny import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType @@ -45,8 +44,7 @@ class RenameParameterToMatchOverriddenMethodFix( companion object : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { val parameter = diagnostic.psiElement.getNonStrictParentOfType() ?: return null - val parameterDescriptor = parameter.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? ValueParameterDescriptor - ?: return null + val parameterDescriptor = parameter.resolveToParameterDescriptorIfAny(BodyResolveMode.FULL) ?: return null val parameterFromSuperclassName = parameterDescriptor .overriddenDescriptors .map { it.name.asString() } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt index ef149baa961..c0409c361d9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SuperClassNotInitialized.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.caches.resolve.resolveToParameterDescriptorIfAny import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.isVisible import org.jetbrains.kotlin.idea.core.moveCaret @@ -167,7 +168,7 @@ object SuperClassNotInitialized : KotlinIntentionActionsFactory() { val nameString = parameter.name.asString() val existingParameter = oldParameters.firstOrNull { it.name == nameString } if (existingParameter != null) { - val type = (existingParameter.resolveToDescriptorIfAny() as? VariableDescriptor)?.type + val type = (existingParameter.resolveToParameterDescriptorIfAny() as? VariableDescriptor)?.type ?: return null if (type.isSubtypeOf(parameter.type)) continue // use existing parameter } diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt index 32228ec457c..32b56e8f3a5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt @@ -256,7 +256,7 @@ class InflowSlicer( .forEach { (it.element?.parent as? KtProperty)?.processPropertyAssignments() } } - val parameterDescriptor = resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return + val parameterDescriptor = resolveToParameterDescriptorIfAny(BodyResolveMode.FULL) ?: return (function as? KtFunction)?.processCalls(parentUsage.scope.toSearchScope()) body@ { val refElement = it.element ?: return@body