[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
This commit is contained in:
Denis Zharkov
2019-05-15 15:43:34 +03:00
committed by Dmitry Savvinov
parent 01f0589ddf
commit 5f10252185
@@ -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 ->