From 8f4a580c1792ecdd029f8ae61a86abd06384bc35 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Tue, 18 Jul 2023 22:15:00 +0200 Subject: [PATCH] [FIR] Report EXPECTED_CLASS_CONSTRUCTOR_DELEGATION_CALL ^KT-59069 Fixed --- .../declaration/FirExpectConsistencyChecker.kt | 13 +++++++++++-- .../explicitConstructorDelegation.fir.kt | 4 ++-- .../headerClass/headerClassWithFunctionBody.fir.kt | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectConsistencyChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectConsistencyChecker.kt index 6bce6d60c91..1366fad4ff3 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectConsistencyChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectConsistencyChecker.kt @@ -25,8 +25,7 @@ object FirExpectConsistencyChecker : FirBasicDeclarationChecker() { if ( declaration !is FirMemberDeclaration || !isTopLevel && !isInsideClass || - !declaration.isExpect || - declaration is FirConstructor + !declaration.isExpect ) { return } @@ -34,6 +33,16 @@ object FirExpectConsistencyChecker : FirBasicDeclarationChecker() { val source = declaration.source ?: return if (source.kind is KtFakeSourceElementKind) return + if (declaration is FirConstructor) { + if (!declaration.isPrimary) { + val delegatedConstructorSource = declaration.delegatedConstructor?.source + if (delegatedConstructorSource?.kind !is KtFakeSourceElementKind) { + reporter.reportOn(delegatedConstructorSource, FirErrors.EXPECTED_CLASS_CONSTRUCTOR_DELEGATION_CALL, context) + } + } + return + } + if (Visibilities.isPrivate(declaration.visibility)) { reporter.reportOn(source, FirErrors.EXPECTED_PRIVATE_DECLARATION, context) } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/explicitConstructorDelegation.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/explicitConstructorDelegation.fir.kt index 89eb169a7e3..3fe9c4e0f72 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/explicitConstructorDelegation.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/explicitConstructorDelegation.fir.kt @@ -3,11 +3,11 @@ expect open class A { constructor(s: String) - constructor(n: Number) : this("A") + constructor(n: Number) : this("A") } expect class B : A { constructor(i: Int) - constructor() : super("B") + constructor() : super("B") } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/headerClassWithFunctionBody.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/headerClassWithFunctionBody.fir.kt index d8dec0f6b42..a7c28e57df7 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/headerClassWithFunctionBody.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/headerClassWithFunctionBody.fir.kt @@ -13,7 +13,7 @@ "no" } - constructor() : this("no") + constructor() : this("no") val prop: String = "no"