Resolve ambiguity between kotlin.Throws and kotlin.native.Throws

KT-35468
This commit is contained in:
Denis Zharkov
2020-04-23 15:22:04 +03:00
committed by Ilya Gorbunov
parent d3f541a715
commit d0f4631192
2 changed files with 15 additions and 1 deletions
@@ -49,3 +49,5 @@ val JVM_FIELD_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmField")
val JVM_THROWS_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.Throws")
val KOTLIN_THROWS_ANNOTATION_FQ_NAME = FqName("kotlin.Throws")
val KOTLIN_NATIVE_THROWS_ANNOTATION_FQ_NAME = FqName("kotlin.native.Throws")
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.psi.KtImportInfo
import org.jetbrains.kotlin.psi.KtPsiUtil
import org.jetbrains.kotlin.resolve.*
import org.jetbrains.kotlin.resolve.annotations.JVM_THROWS_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.resolve.annotations.KOTLIN_NATIVE_THROWS_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.resolve.annotations.KOTLIN_THROWS_ANNOTATION_FQ_NAME
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
@@ -246,7 +247,7 @@ class LazyImportScope(
if (descriptor !is ClassDescriptor && descriptor !is TypeAliasDescriptor || !isClassifierVisible(descriptor))
continue /* type parameters can't be imported */
if (target != null && target != descriptor) {
if (target.isKotlinOrJvmThrows() && descriptor.isKotlinOrJvmThrows()) {
if (isKotlinOrJvmThrowsAmbiguity(descriptor, target) || isKotlinOrNativeThrowsAmbiguity(descriptor, target)) {
if (descriptor.isKotlinThrows()) {
target = descriptor
}
@@ -261,12 +262,23 @@ class LazyImportScope(
target
}
private fun isKotlinOrJvmThrowsAmbiguity(c1: ClassifierDescriptor, c2: ClassifierDescriptor) =
c1.isKotlinOrJvmThrows() && c2.isKotlinOrJvmThrows()
private fun isKotlinOrNativeThrowsAmbiguity(c1: ClassifierDescriptor, c2: ClassifierDescriptor) =
c1.isKotlinOrNativeThrows() && c2.isKotlinOrNativeThrows()
private fun ClassifierDescriptor.isKotlinThrows() = fqNameOrNull() == KOTLIN_THROWS_ANNOTATION_FQ_NAME
private fun ClassifierDescriptor.isKotlinOrJvmThrows(): Boolean {
if (name != JVM_THROWS_ANNOTATION_FQ_NAME.shortName()) return false
return isKotlinThrows() || fqNameOrNull() == JVM_THROWS_ANNOTATION_FQ_NAME
}
private fun ClassifierDescriptor.isKotlinOrNativeThrows(): Boolean {
if (name != KOTLIN_THROWS_ANNOTATION_FQ_NAME.shortName()) return false
return isKotlinThrows() || fqNameOrNull() == KOTLIN_NATIVE_THROWS_ANNOTATION_FQ_NAME
}
override fun getContributedPackage(name: Name): PackageViewDescriptor? = null
override fun getContributedVariables(name: Name, location: LookupLocation): Collection<VariableDescriptor> {