Fix invalid signature for UL method

Fixed #KT-32245
This commit is contained in:
Igor Yakovlev
2020-04-20 13:23:36 +03:00
parent ed3ae785fb
commit 8a7aac728d
5 changed files with 35 additions and 4 deletions
@@ -22,12 +22,15 @@ import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature.getSpecialSignatureInfo
import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.KtTypeParameterListOwner
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind
import org.jetbrains.kotlin.types.RawType
internal const val METHOD_INDEX_FOR_GETTER = 1
internal const val METHOD_INDEX_FOR_SETTER = 2
@@ -69,10 +72,23 @@ internal abstract class KtUltraLightMethod(
}
protected fun computeCheckNeedToErasureParametersTypes(methodDescriptor: FunctionDescriptor?): Boolean {
return methodDescriptor
?.getSpecialSignatureInfo()
?.let { it.valueParametersSignature !== null }
?: false
if (methodDescriptor == null) return false
val hasSpecialSignatureInfo = methodDescriptor.getSpecialSignatureInfo()
?.let { it.valueParametersSignature != null } ?: false
if (hasSpecialSignatureInfo) return true
// Workaround for KT-32245 that checks if this signature could be affected by KT-38406
if (!DescriptorUtils.isOverride(methodDescriptor)) return false
val hasStarProjectionParameterType = methodDescriptor.valueParameters
.any { parameter -> parameter.type.arguments.any { it.isStarProjection } }
if (!hasStarProjectionParameterType) return false
return methodDescriptor.overriddenDescriptors
.filterIsInstance<JavaMethodDescriptor>()
.any { it.valueParameters.any { parameter -> parameter.type is RawType } }
}
abstract override fun buildTypeParameterList(): PsiTypeParameterList