[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.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind 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.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver
import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.resolve.source.getPsi
@@ -538,8 +539,13 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor {
val containingDeclaration = oldDescriptor.containingDeclaration val containingDeclaration = oldDescriptor.containingDeclaration
val parametersScope = when { val parametersScope = when {
oldDescriptor is ConstructorDescriptor && containingDeclaration is ClassDescriptorWithResolutionScopes -> oldDescriptor is ConstructorDescriptor && containingDeclaration is ClassDescriptorWithResolutionScopes -> {
containingDeclaration.scopeForInitializerResolution val classDescriptor = containingDeclaration.classId?.let {
function.findModuleDescriptor().findClassAcrossModuleDependencies(it) as? ClassDescriptorWithResolutionScopes
} ?: containingDeclaration
classDescriptor.scopeForInitializerResolution
}
function is KtFunction -> function is KtFunction ->
function.getBodyScope(bindingContext) function.getBodyScope(bindingContext)
else -> else ->