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.
|
* and then takes the relevant descriptor from binding context.
|
||||||
* The exact set of declarations to resolve depends on bodyResolveMode
|
* The exact set of declarations to resolve depends on bodyResolveMode
|
||||||
*/
|
*/
|
||||||
inline fun <reified D : DeclarationDescriptor> KtDeclaration.resolveToDescriptorIfAny(
|
fun KtDeclaration.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): DeclarationDescriptor? {
|
||||||
bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL,
|
|
||||||
klass: Class<D> = D::class.java
|
|
||||||
): D? {
|
|
||||||
//TODO: BodyResolveMode.PARTIAL is not quite safe!
|
//TODO: BodyResolveMode.PARTIAL is not quite safe!
|
||||||
val context = analyze(bodyResolveMode)
|
val context = analyze(bodyResolveMode)
|
||||||
if (this is KtParameter && this.hasValOrVar() && klass != ValueParameterDescriptor::class.java) {
|
return if (this is KtParameter && hasValOrVar()) {
|
||||||
return context.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this) as? D
|
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) =
|
fun KtParameter.resolveToParameterDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): ValueParameterDescriptor? {
|
||||||
resolveToDescriptorIfAny<DeclarationDescriptor>(bodyResolveMode)
|
val context = analyze(bodyResolveMode)
|
||||||
|
return context.get(BindingContext.VALUE_PARAMETER, this) as? ValueParameterDescriptor
|
||||||
fun KtParameter.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL) =
|
}
|
||||||
resolveToDescriptorIfAny<ValueParameterDescriptor>(bodyResolveMode)
|
|
||||||
|
|
||||||
fun KtFile.resolveImportReference(fqName: FqName): Collection<DeclarationDescriptor> {
|
fun KtFile.resolveImportReference(fqName: FqName): Collection<DeclarationDescriptor> {
|
||||||
val facade = getResolutionFacade()
|
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.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.getJavaMethodDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.getJavaMethodDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
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.references.unwrappedTargets
|
||||||
import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchRequest
|
import org.jetbrains.kotlin.idea.search.declarationsSearch.HierarchySearchRequest
|
||||||
import org.jetbrains.kotlin.idea.search.declarationsSearch.searchInheritors
|
import org.jetbrains.kotlin.idea.search.declarationsSearch.searchInheritors
|
||||||
@@ -60,10 +61,10 @@ val KtDeclaration.constructor: ConstructorDescriptor?
|
|||||||
}
|
}
|
||||||
|
|
||||||
val KtParameter.descriptor: ValueParameterDescriptor?
|
val KtParameter.descriptor: ValueParameterDescriptor?
|
||||||
get() = this.resolveToDescriptorIfAny<ValueParameterDescriptor>(BodyResolveMode.FULL)
|
get() = this.resolveToParameterDescriptorIfAny(BodyResolveMode.FULL)
|
||||||
|
|
||||||
val KtParameter.propertyDescriptor: PropertyDescriptor?
|
val KtParameter.propertyDescriptor: PropertyDescriptor?
|
||||||
get() = this.resolveToDescriptorIfAny<PropertyDescriptor>(BodyResolveMode.FULL)
|
get() = this.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? PropertyDescriptor
|
||||||
|
|
||||||
fun PsiReference.checkUsageVsOriginalDescriptor(
|
fun PsiReference.checkUsageVsOriginalDescriptor(
|
||||||
targetDescriptor: DeclarationDescriptor,
|
targetDescriptor: DeclarationDescriptor,
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import com.intellij.util.ProcessingContext
|
|||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
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.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtFunction
|
import org.jetbrains.kotlin.psi.KtFunction
|
||||||
import org.jetbrains.kotlin.psi.KtParameter
|
import org.jetbrains.kotlin.psi.KtParameter
|
||||||
@@ -119,7 +120,7 @@ class KtParameterPattern : PsiElementPattern<KtParameter, KtParameterPattern>(Kt
|
|||||||
return withPatternCondition("KtParameterPattern-withAnnotation") { ktParameter, _ ->
|
return withPatternCondition("KtParameterPattern-withAnnotation") { ktParameter, _ ->
|
||||||
if (ktParameter.annotationEntries.isEmpty()) return@withPatternCondition false
|
if (ktParameter.annotationEntries.isEmpty()) return@withPatternCondition false
|
||||||
|
|
||||||
val parameterDescriptor = ktParameter.resolveToDescriptorIfAny()
|
val parameterDescriptor = ktParameter.resolveToParameterDescriptorIfAny()
|
||||||
parameterDescriptor is ValueParameterDescriptor && parameterDescriptor.annotations.any { annotation ->
|
parameterDescriptor is ValueParameterDescriptor && parameterDescriptor.annotations.any { annotation ->
|
||||||
annotation.fqName?.asString() == fqName
|
annotation.fqName?.asString() == fqName
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,10 +18,9 @@ package org.jetbrains.kotlin.idea.quickfix
|
|||||||
|
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
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.intentions.RemoveEmptyPrimaryConstructorIntention
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
@@ -40,7 +39,7 @@ class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixA
|
|||||||
val element = element ?: return
|
val element = element ?: return
|
||||||
val primaryConstructor = element.parent?.parent as? KtPrimaryConstructor
|
val primaryConstructor = element.parent?.parent as? KtPrimaryConstructor
|
||||||
val parameterList = element.parent as? KtParameterList
|
val parameterList = element.parent as? KtParameterList
|
||||||
val parameterDescriptor = element.resolveToDescriptorIfAny(BodyResolveMode.FULL) ?: return
|
val parameterDescriptor = element.resolveToParameterDescriptorIfAny(BodyResolveMode.FULL) ?: return
|
||||||
ChangeFunctionSignatureFix.runRemoveParameter(parameterDescriptor, element)
|
ChangeFunctionSignatureFix.runRemoveParameter(parameterDescriptor, element)
|
||||||
val nextParameter = parameterList?.parameters?.getOrNull(parameterDescriptor.index)
|
val nextParameter = parameterList?.parameters?.getOrNull(parameterDescriptor.index)
|
||||||
if (nextParameter != null) {
|
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.editor.Editor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.refactoring.rename.RenameProcessor
|
import com.intellij.refactoring.rename.RenameProcessor
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
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.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtParameter
|
import org.jetbrains.kotlin.psi.KtParameter
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
||||||
@@ -45,8 +44,7 @@ class RenameParameterToMatchOverriddenMethodFix(
|
|||||||
companion object : KotlinSingleIntentionActionFactory() {
|
companion object : KotlinSingleIntentionActionFactory() {
|
||||||
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
|
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
|
||||||
val parameter = diagnostic.psiElement.getNonStrictParentOfType<KtParameter>() ?: return null
|
val parameter = diagnostic.psiElement.getNonStrictParentOfType<KtParameter>() ?: return null
|
||||||
val parameterDescriptor = parameter.resolveToDescriptorIfAny(BodyResolveMode.FULL) as? ValueParameterDescriptor
|
val parameterDescriptor = parameter.resolveToParameterDescriptorIfAny(BodyResolveMode.FULL) ?: return null
|
||||||
?: return null
|
|
||||||
val parameterFromSuperclassName = parameterDescriptor
|
val parameterFromSuperclassName = parameterDescriptor
|
||||||
.overriddenDescriptors
|
.overriddenDescriptors
|
||||||
.map { it.name.asString() }
|
.map { it.name.asString() }
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
|||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
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.caches.resolve.resolveToParameterDescriptorIfAny
|
||||||
import org.jetbrains.kotlin.idea.core.ShortenReferences
|
import org.jetbrains.kotlin.idea.core.ShortenReferences
|
||||||
import org.jetbrains.kotlin.idea.core.isVisible
|
import org.jetbrains.kotlin.idea.core.isVisible
|
||||||
import org.jetbrains.kotlin.idea.core.moveCaret
|
import org.jetbrains.kotlin.idea.core.moveCaret
|
||||||
@@ -167,7 +168,7 @@ object SuperClassNotInitialized : KotlinIntentionActionsFactory() {
|
|||||||
val nameString = parameter.name.asString()
|
val nameString = parameter.name.asString()
|
||||||
val existingParameter = oldParameters.firstOrNull { it.name == nameString }
|
val existingParameter = oldParameters.firstOrNull { it.name == nameString }
|
||||||
if (existingParameter != null) {
|
if (existingParameter != null) {
|
||||||
val type = (existingParameter.resolveToDescriptorIfAny() as? VariableDescriptor)?.type
|
val type = (existingParameter.resolveToParameterDescriptorIfAny() as? VariableDescriptor)?.type
|
||||||
?: return null
|
?: return null
|
||||||
if (type.isSubtypeOf(parameter.type)) continue // use existing parameter
|
if (type.isSubtypeOf(parameter.type)) continue // use existing parameter
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -256,7 +256,7 @@ class InflowSlicer(
|
|||||||
.forEach { (it.element?.parent as? KtProperty)?.processPropertyAssignments() }
|
.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@ {
|
(function as? KtFunction)?.processCalls(parentUsage.scope.toSearchScope()) body@ {
|
||||||
val refElement = it.element ?: return@body
|
val refElement = it.element ?: return@body
|
||||||
|
|||||||
Reference in New Issue
Block a user