From c569fc170b6ebfade32a89e8cc8828f23c4d91a7 Mon Sep 17 00:00:00 2001 From: "Anastasia.Nekrasova" Date: Thu, 30 Nov 2023 11:07:29 +0200 Subject: [PATCH] [K2] Disappeared UNSUPPORTED Prohibit DelegationBy specifier when no primary constructor ^KT-59881 --- .../declaration/FirSupertypesChecker.kt | 27 +++++++++++++++++++ .../delegationByWithoutPrimary.fir.kt | 6 ----- .../delegationByWithoutPrimary.kt | 3 ++- 3 files changed, 29 insertions(+), 7 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.fir.kt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt index 8a769cf526c..b10571ffb2e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt @@ -20,6 +20,9 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirField import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.utils.isExpect +import org.jetbrains.kotlin.fir.declarations.utils.isInterface import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.languageVersionSettings @@ -102,6 +105,7 @@ object FirSupertypesChecker : FirClassChecker() { } checkDelegationNotToInterface(declaration, context, reporter) + checkDelegationWithoutPrimaryConstructor(declaration, context, reporter) if (declaration is FirRegularClass && declaration.superTypeRefs.size > 1) { checkInconsistentTypeParameters(listOf(Pair(null, declaration.symbol)), context, reporter, declaration.source, true) @@ -219,4 +223,27 @@ object FirSupertypesChecker : FirClassChecker() { ) } + + private fun checkDelegationWithoutPrimaryConstructor( + declaration: FirClass, + context: CheckerContext, + reporter: DiagnosticReporter, + ) { + if (declaration.isInterface) return + if (declaration.isExpect) return + val primaryConstructor = declaration.primaryConstructorIfAny(context.session) + if (primaryConstructor != null) return + for (subDeclaration in declaration.declarations) { + if (subDeclaration !is FirField) continue + if (subDeclaration.visibility == Visibilities.Private && subDeclaration.name.isDelegated) { + reporter.reportOn( + subDeclaration.source, + FirErrors.UNSUPPORTED, + "Delegation without primary constructor is not supported", + context + ) + } + } + } + } diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.fir.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.fir.kt deleted file mode 100644 index 6058e862c1e..00000000000 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.fir.kt +++ /dev/null @@ -1,6 +0,0 @@ -interface A -class AImpl : A - -class B : A by AImpl() { - constructor() -} diff --git a/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.kt b/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.kt index 7e25869a417..11438c72b2f 100644 --- a/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.kt +++ b/compiler/testData/diagnostics/tests/secondaryConstructors/delegationByWithoutPrimary.kt @@ -1,6 +1,7 @@ +// FIR_IDENTICAL interface A class AImpl : A class B : A by AImpl() { constructor() -} +} \ No newline at end of file