New J2K: check if method reference has functional type on PsiType instead of JKType

As it may reference to uninitialized universe symbol

#KT-33434 fixed
This commit is contained in:
Ilya Kirillov
2019-08-26 17:25:35 +03:00
parent ca0cc13097
commit 131df66087
2 changed files with 8 additions and 6 deletions
@@ -363,10 +363,10 @@ class JavaToJKTreeBuilder constructor(
functionalInterfaceType
?.takeUnless { type ->
type.safeAs<PsiClassType>()?.parameters?.any { it is PsiCapturedWildcardType } == true
}?.takeUnless { type ->
type.isKotlinFunctionalType
}?.toJK(symbolProvider)
?.takeUnless { type ->
type.isKotlinFunctionType
}?.asTypeElement() ?: JKTypeElementImpl(JKNoTypeImpl)
?.asTypeElement() ?: JKTypeElementImpl(JKNoTypeImpl)
fun PsiMethodReferenceExpression.toJK(): JKMethodReferenceExpression {
val symbol = symbolProvider.provideSymbolForReference<JKSymbol>(this).let { symbol ->
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaClassDescriptor
import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName
import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
@@ -157,12 +158,13 @@ fun KotlinType.toJK(symbolProvider: JKSymbolProvider): JKType {
}
}
val JKType.isKotlinFunctionType: Boolean
val PsiType.isKotlinFunctionalType: Boolean
get() {
val fqName = safeAs<JKClassType>()?.fqName ?: return false
return functionalTypeRegex.matches(fqName)
val fqName = safeAs<PsiClassType>()?.resolve()?.getKotlinFqName() ?: return false
return functionalTypeRegex.matches(fqName.asString())
}
private val functionalTypeRegex = """(kotlin\.jvm\.functions|kotlin)\.Function[\d+]""".toRegex()