From 6fc27c22f44d8051bf2e89f1657c0d9741c281c0 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 31 May 2022 13:38:43 +0200 Subject: [PATCH] K1:report warning on OptIn usages inside SAM constructor #KT-47708 Fixed --- .../kotlin/resolve/checkers/OptInUsageChecker.kt | 10 ++++++++++ .../testsWithStdLib/experimental/insideSAM.kt | 2 +- .../kotlin/resolve/sam/SamConstructorDescriptor.kt | 7 ++++++- .../resolve/sam/SamTypeAliasConstructorDescriptor.kt | 3 +++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/OptInUsageChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/OptInUsageChecker.kt index 2fbcc991aa3..b2844f8f2b7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/OptInUsageChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/OptInUsageChecker.kt @@ -52,6 +52,7 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver import org.jetbrains.kotlin.resolve.deprecation.DeprecationSettings import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.types.AbbreviatedType import org.jetbrains.kotlin.types.KotlinType @@ -97,6 +98,15 @@ class OptInUsageChecker(project: Project) : CallChecker { return } } + if (resultingDescriptor is SamConstructorDescriptor) { + // KT-47708 special case (warning only) + val methodDescriptor = resultingDescriptor.getSingleAbstractMethod() + val samOptIns = methodDescriptor.loadOptIns(moduleAnnotationsResolver, context.languageVersionSettings) + .map { (fqName, _, message) -> + OptInDescription(fqName, OptInDescription.Severity.WARNING, message) + } + reportNotAllowedOptIns(samOptIns, reportOn, context) + } reportNotAllowedOptIns(optIns, reportOn, context) } diff --git a/compiler/testData/diagnostics/testsWithStdLib/experimental/insideSAM.kt b/compiler/testData/diagnostics/testsWithStdLib/experimental/insideSAM.kt index 1e35fc476ce..6a05aceff65 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/experimental/insideSAM.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/experimental/insideSAM.kt @@ -11,7 +11,7 @@ fun regressionTestOverrides() { val anonymous: StableInterface = object : StableInterface { override fun experimentalMethod() {} // correctly fails check } - val lambda = StableInterface {} // this does not get flagged + val lambda = StableInterface {} // this does not get flagged } @ExperimentalKotlinAnnotation diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConstructorDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConstructorDescriptor.kt index 26fdd77373b..1116f073cb5 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConstructorDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamConstructorDescriptor.kt @@ -13,7 +13,9 @@ import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.synthetic.FunctionInterfaceConstructorDescriptor import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude -interface SamConstructorDescriptor : SimpleFunctionDescriptor, FunctionInterfaceConstructorDescriptor +interface SamConstructorDescriptor : SimpleFunctionDescriptor, FunctionInterfaceConstructorDescriptor { + fun getSingleAbstractMethod(): CallableMemberDescriptor +} class SamConstructorDescriptorImpl( containingDeclaration: DeclarationDescriptor, @@ -28,6 +30,9 @@ class SamConstructorDescriptorImpl( ), SamConstructorDescriptor { override val baseDescriptorForSynthetic: ClassDescriptor get() = samInterface + + override fun getSingleAbstractMethod(): CallableMemberDescriptor = + getAbstractMembers(samInterface).single() } object SamConstructorDescriptorKindExclude : DescriptorKindExclude() { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamTypeAliasConstructorDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamTypeAliasConstructorDescriptor.kt index 77128f2a488..2fbc12861ad 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamTypeAliasConstructorDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/sam/SamTypeAliasConstructorDescriptor.kt @@ -27,6 +27,9 @@ class SamTypeAliasConstructorDescriptorImpl( CallableMemberDescriptor.Kind.SYNTHESIZED, typeAliasDescriptor.source ), SamTypeAliasConstructorDescriptor { + override fun getSingleAbstractMethod(): CallableMemberDescriptor = + expandedConstructorDescriptor.getSingleAbstractMethod() + override val baseDescriptorForSynthetic: ClassDescriptor get() = expandedConstructorDescriptor.baseDescriptorForSynthetic }