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 df7a1ac7bd4..432f9e2b50e 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 @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* @@ -56,15 +57,24 @@ 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 */ -fun KtDeclaration.resolveToDescriptorIfAny(bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL): DeclarationDescriptor? { +inline fun KtDeclaration.resolveToDescriptorIfAny( + bodyResolveMode: BodyResolveMode = BodyResolveMode.PARTIAL, + klass: Class = D::class.java +): D? { //TODO: BodyResolveMode.PARTIAL is not quite safe! val context = analyze(bodyResolveMode) - if (this is KtParameter && this.hasValOrVar()) { - return context.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this) + if (this is KtParameter && this.hasValOrVar() && klass != ValueParameterDescriptor::class.java) { + return context.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this) as? D } - return 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 KtFile.resolveImportReference(fqName: FqName): Collection { val facade = getResolutionFacade() return facade.resolveImportReference(facade.moduleDescriptor, fqName) 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 29618b60246..eac394515e9 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 @@ -47,7 +47,7 @@ import org.jetbrains.kotlin.resolve.OverridingUtil import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode val KtDeclaration.descriptor: DeclarationDescriptor? - get() = this.resolveToDescriptorIfAny(BodyResolveMode.FULL) + get() = if (this is KtParameter) this.descriptor else this.resolveToDescriptorIfAny(BodyResolveMode.FULL) val KtDeclaration.constructor: ConstructorDescriptor? get() { @@ -59,8 +59,11 @@ val KtDeclaration.constructor: ConstructorDescriptor? } } +val KtParameter.descriptor: ValueParameterDescriptor? + get() = this.resolveToDescriptorIfAny(BodyResolveMode.FULL) + val KtParameter.propertyDescriptor: PropertyDescriptor? - get() = this.analyze().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this) + get() = this.resolveToDescriptorIfAny(BodyResolveMode.FULL) fun PsiReference.checkUsageVsOriginalDescriptor( targetDescriptor: DeclarationDescriptor, diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt index 1faff94ac20..573e6612676 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt @@ -40,7 +40,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) as? ValueParameterDescriptor ?: return + val parameterDescriptor = element.resolveToDescriptorIfAny(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/slicer/Slicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt index 2aef5b982a9..32228ec457c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt @@ -41,9 +41,7 @@ import org.jetbrains.kotlin.cfg.pseudocode.instructions.eval.* import org.jetbrains.kotlin.cfg.pseudocode.instructions.jumps.ReturnValueInstruction import org.jetbrains.kotlin.cfg.pseudocodeTraverser.TraversalOrder import org.jetbrains.kotlin.cfg.pseudocodeTraverser.traverse -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithSource -import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.SyntheticFieldDescriptor import org.jetbrains.kotlin.idea.caches.resolve.* import org.jetbrains.kotlin.idea.core.isOverridable