Do not load annotations of each function in JvmBuiltInsSettings.isFunctionAvailable
This fixes the exception in the case described in KT-14094 because we no longer try to load annotations on functions which cannot be annotated with @PlatformDependent. (However, the underlying problem in KT-14094 is not fixed by this, and is still reproducible on explicit call to KCallable.annotations.) #KT-14094 In Progress
This commit is contained in:
+9
-7
@@ -263,10 +263,14 @@ open class JvmBuiltInsSettings(
|
|||||||
private fun ClassDescriptor.getJavaAnalogue(): LazyJavaClassDescriptor? {
|
private fun ClassDescriptor.getJavaAnalogue(): LazyJavaClassDescriptor? {
|
||||||
// Prevents recursive dependency: memberScope(Any) -> memberScope(Object) -> memberScope(Any)
|
// Prevents recursive dependency: memberScope(Any) -> memberScope(Object) -> memberScope(Any)
|
||||||
// No additional members should be added to Any
|
// No additional members should be added to Any
|
||||||
if (isAny) return null
|
if (KotlinBuiltIns.isAny(this)) return null
|
||||||
|
|
||||||
val fqName = fqNameUnsafe.takeIf { it.isSafe }?.toSafe() ?: return null
|
// Optimization: only classes under kotlin.* can have Java analogues
|
||||||
val javaAnalogueFqName = j2kClassMap.mapKotlinToJava(fqName.toUnsafe())?.asSingleFqName() ?: return null
|
if (!KotlinBuiltIns.isUnderKotlinPackage(this)) return null
|
||||||
|
|
||||||
|
val fqName = fqNameUnsafe
|
||||||
|
if (!fqName.isSafe) return null
|
||||||
|
val javaAnalogueFqName = j2kClassMap.mapKotlinToJava(fqName)?.asSingleFqName() ?: return null
|
||||||
|
|
||||||
return ownerModuleDescriptor.resolveClassByFqName(javaAnalogueFqName, NoLookupLocation.FROM_BUILTINS) as? LazyJavaClassDescriptor
|
return ownerModuleDescriptor.resolveClassByFqName(javaAnalogueFqName, NoLookupLocation.FROM_BUILTINS) as? LazyJavaClassDescriptor
|
||||||
}
|
}
|
||||||
@@ -308,11 +312,11 @@ open class JvmBuiltInsSettings(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun isFunctionAvailable(classDescriptor: ClassDescriptor, functionDescriptor: SimpleFunctionDescriptor): Boolean {
|
override fun isFunctionAvailable(classDescriptor: ClassDescriptor, functionDescriptor: SimpleFunctionDescriptor): Boolean {
|
||||||
|
val javaAnalogueClassDescriptor = classDescriptor.getJavaAnalogue() ?: return true
|
||||||
|
|
||||||
if (!functionDescriptor.annotations.hasAnnotation(PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME)) return true
|
if (!functionDescriptor.annotations.hasAnnotation(PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME)) return true
|
||||||
if (!isAdditionalBuiltInsFeatureSupported) return false
|
if (!isAdditionalBuiltInsFeatureSupported) return false
|
||||||
|
|
||||||
val javaAnalogueClassDescriptor = classDescriptor.getJavaAnalogue() ?: return true
|
|
||||||
|
|
||||||
val jvmDescriptor = functionDescriptor.computeJvmDescriptor()
|
val jvmDescriptor = functionDescriptor.computeJvmDescriptor()
|
||||||
return javaAnalogueClassDescriptor
|
return javaAnalogueClassDescriptor
|
||||||
.unsubstitutedMemberScope
|
.unsubstitutedMemberScope
|
||||||
@@ -474,8 +478,6 @@ open class JvmBuiltInsSettings(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val ClassDescriptor.isAny: Boolean get() = fqNameUnsafe == KotlinBuiltIns.FQ_NAMES.any
|
|
||||||
|
|
||||||
private class FallbackBuiltIns private constructor() : KotlinBuiltIns(LockBasedStorageManager()) {
|
private class FallbackBuiltIns private constructor() : KotlinBuiltIns(LockBasedStorageManager()) {
|
||||||
init {
|
init {
|
||||||
createBuiltInsModule()
|
createBuiltInsModule()
|
||||||
|
|||||||
Reference in New Issue
Block a user