Introduce resolveToParameterDescriptorIfAny(), drop reified version
This commit is contained in:
@@ -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 <reified D : DeclarationDescriptor> KtDeclaration.resolveToDescriptorIfAny(
|
||||
bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL,
|
||||
klass: Class<D> = 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<DeclarationDescriptor>(bodyResolveMode)
|
||||
|
||||
fun KtParameter.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL) =
|
||||
resolveToDescriptorIfAny<ValueParameterDescriptor>(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<DeclarationDescriptor> {
|
||||
val facade = getResolutionFacade()
|
||||
|
||||
@@ -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<ValueParameterDescriptor>(BodyResolveMode.FULL)
|
||||
get() = this.resolveToParameterDescriptorIfAny(BodyResolveMode.FULL)
|
||||
|
||||
val KtParameter.propertyDescriptor: PropertyDescriptor?
|
||||
get() = this.resolveToDescriptorIfAny<PropertyDescriptor>(BodyResolveMode.FULL)
|
||||
get() = this.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? PropertyDescriptor
|
||||
|
||||
fun PsiReference.checkUsageVsOriginalDescriptor(
|
||||
targetDescriptor: DeclarationDescriptor,
|
||||
|
||||
@@ -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<KtParameter, KtParameterPattern>(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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
+2
-4
@@ -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<KtParameter>() ?: 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() }
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user