Psi Unifier: Match unifier parameters by declaration instead of descriptor (since descriptor identity may change in the new context)

This commit is contained in:
Alexey Sedunov
2015-11-20 16:50:20 +03:00
parent 1b162e0294
commit c82d431cff
@@ -45,6 +45,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
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.types.ErrorUtils import org.jetbrains.kotlin.types.ErrorUtils
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.TypeUtils
@@ -827,8 +828,9 @@ public class KotlinPsiUnifier(
val referencedPatternDescriptor = (patternElementUnwrapped as? KtReferenceExpression)?.let { val referencedPatternDescriptor = (patternElementUnwrapped as? KtReferenceExpression)?.let {
it.bindingContext[BindingContext.REFERENCE_TARGET, it] it.bindingContext[BindingContext.REFERENCE_TARGET, it]
} }
val parameter = descriptorToParameter[referencedPatternDescriptor] val referencedPatternDeclaration = (referencedPatternDescriptor as? DeclarationDescriptorWithSource)?.source?.getPsi()
if (parameter != null) { val parameter = descriptorToParameter[referencedPatternDeclaration]
if (referencedPatternDeclaration != null && parameter != null) {
if (targetElementUnwrapped !is KtExpression) return UNMATCHED if (targetElementUnwrapped !is KtExpression) return UNMATCHED
if (!targetElementUnwrapped.checkType(parameter)) return UNMATCHED if (!targetElementUnwrapped.checkType(parameter)) return UNMATCHED
@@ -876,7 +878,9 @@ public class KotlinPsiUnifier(
} }
} }
private val descriptorToParameter = ContainerUtil.newMapFromValues(parameters.iterator()) { it!!.descriptor } private val descriptorToParameter = ContainerUtil.newMapFromValues(parameters.iterator()) {
(it!!.descriptor as? DeclarationDescriptorWithSource)?.source?.getPsi()
}
private fun PsiElement.unwrap(): PsiElement? { private fun PsiElement.unwrap(): PsiElement? {
return when (this) { return when (this) {