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 functionalInterfaceType
?.takeUnless { type -> ?.takeUnless { type ->
type.safeAs<PsiClassType>()?.parameters?.any { it is PsiCapturedWildcardType } == true type.safeAs<PsiClassType>()?.parameters?.any { it is PsiCapturedWildcardType } == true
}?.takeUnless { type ->
type.isKotlinFunctionalType
}?.toJK(symbolProvider) }?.toJK(symbolProvider)
?.takeUnless { type -> ?.asTypeElement() ?: JKTypeElementImpl(JKNoTypeImpl)
type.isKotlinFunctionType
}?.asTypeElement() ?: JKTypeElementImpl(JKNoTypeImpl)
fun PsiMethodReferenceExpression.toJK(): JKMethodReferenceExpression { fun PsiMethodReferenceExpression.toJK(): JKMethodReferenceExpression {
val symbol = symbolProvider.provideSymbolForReference<JKSymbol>(this).let { symbol -> 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.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.util.getJavaClassDescriptor 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.j2k.ast.Nullability
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi 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() { get() {
val fqName = safeAs<JKClassType>()?.fqName ?: return false val fqName = safeAs<PsiClassType>()?.resolve()?.getKotlinFqName() ?: return false
return functionalTypeRegex.matches(fqName) return functionalTypeRegex.matches(fqName.asString())
} }
private val functionalTypeRegex = """(kotlin\.jvm\.functions|kotlin)\.Function[\d+]""".toRegex() private val functionalTypeRegex = """(kotlin\.jvm\.functions|kotlin)\.Function[\d+]""".toRegex()