From d3f541a7156c7be1d70a2dc5a660b06483fe73cb Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Fri, 10 Apr 2020 16:05:14 +0300 Subject: [PATCH] Overcome ambiguity between kotlin.Throws and kotlin.jvm.Throws ^KT-35468 In Progress --- .../kotlin/resolve/AnnotationUtil.kt | 2 ++ .../kotlin/resolve/lazy/LazyImportScope.kt | 22 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt index c55dccc24a8..df0924d2ab5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/AnnotationUtil.kt @@ -47,3 +47,5 @@ val JVM_FIELD_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.JvmField") // If you wish to add another JVM-related annotation and has/find utility methods, please proceed to jvmAnnotationUtil.kt @JvmField val JVM_THROWS_ANNOTATION_FQ_NAME = FqName("kotlin.jvm.Throws") + +val KOTLIN_THROWS_ANNOTATION_FQ_NAME = FqName("kotlin.Throws") diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt index 0fa3fa0937c..0f750bc49ea 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -32,7 +32,10 @@ import org.jetbrains.kotlin.psi.KtImportDirective 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_THROWS_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.ImportingScope import org.jetbrains.kotlin.storage.NotNullLazyValue @@ -242,13 +245,28 @@ class LazyImportScope( val descriptor = getImportScope(directive).getContributedClassifier(name, location) if (descriptor !is ClassDescriptor && descriptor !is TypeAliasDescriptor || !isClassifierVisible(descriptor)) continue /* type parameters can't be imported */ - if (target != null && target != descriptor) return@compute null // ambiguity - target = descriptor + if (target != null && target != descriptor) { + if (target.isKotlinOrJvmThrows() && descriptor.isKotlinOrJvmThrows()) { + if (descriptor.isKotlinThrows()) { + target = descriptor + } + } else { + return@compute null // ambiguity + } + } else { + target = descriptor + } } target } + 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 + } + override fun getContributedPackage(name: Name): PackageViewDescriptor? = null override fun getContributedVariables(name: Name, location: LookupLocation): Collection {