From 5f10252185e8eeb524d55328818037c8de0af5da Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Wed, 15 May 2019 15:43:34 +0300 Subject: [PATCH] [Invariant fix] Avoid using obsolete desciptors as scope content in change signature After type refinement was introduced we sometimes may request some additional data from ModuleDescriptor But if it's been invalidated after first part of refactoring's been applied requesting content may fail (see ModuleDescriptorImpl::assertValid) See the test: org.jetbrains.kotlin.idea.refactoring.introduce.ExtractionTestGenerated.IntroduceLambdaParameter#testLambdaParamInPrimaryConstructor --- .../KotlinChangeSignatureUsageProcessor.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt index 570b250d3a2..9f277fef59e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/changeSignature/KotlinChangeSignatureUsageProcessor.kt @@ -73,6 +73,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind +import org.jetbrains.kotlin.resolve.descriptorUtil.classId import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.resolve.source.getPsi @@ -538,8 +539,13 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor { val containingDeclaration = oldDescriptor.containingDeclaration val parametersScope = when { - oldDescriptor is ConstructorDescriptor && containingDeclaration is ClassDescriptorWithResolutionScopes -> - containingDeclaration.scopeForInitializerResolution + oldDescriptor is ConstructorDescriptor && containingDeclaration is ClassDescriptorWithResolutionScopes -> { + val classDescriptor = containingDeclaration.classId?.let { + function.findModuleDescriptor().findClassAcrossModuleDependencies(it) as? ClassDescriptorWithResolutionScopes + } ?: containingDeclaration + + classDescriptor.scopeForInitializerResolution + } function is KtFunction -> function.getBodyScope(bindingContext) else ->