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 1366fad4ff3..74c3b0073f6 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 @@ -19,8 +19,19 @@ import org.jetbrains.kotlin.fir.declarations.utils.visibility // See old FE's [DeclarationsChecker] object FirExpectConsistencyChecker : FirBasicDeclarationChecker() { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + val source = declaration.source ?: return + if (source.kind is KtFakeSourceElementKind) return + val isTopLevel = context.containingDeclarations.size == 1 - val isInsideClass = context.containingDeclarations.lastOrNull() is FirClass + val lastClass = context.containingDeclarations.lastOrNull() as? FirClass + val isInsideClass = lastClass != null + + if (declaration is FirAnonymousInitializer) { + if (lastClass?.isExpect == true) { + reporter.reportOn(source, FirErrors.EXPECTED_DECLARATION_WITH_BODY, context) + } + return + } if ( declaration !is FirMemberDeclaration || @@ -30,9 +41,6 @@ object FirExpectConsistencyChecker : FirBasicDeclarationChecker() { return } - val source = declaration.source ?: return - if (source.kind is KtFakeSourceElementKind) return - if (declaration is FirConstructor) { if (!declaration.isPrimary) { val delegatedConstructorSource = declaration.delegatedConstructor?.source @@ -40,14 +48,11 @@ object FirExpectConsistencyChecker : FirBasicDeclarationChecker() { reporter.reportOn(delegatedConstructorSource, FirErrors.EXPECTED_CLASS_CONSTRUCTOR_DELEGATION_CALL, context) } } - return - } - - if (Visibilities.isPrivate(declaration.visibility)) { + } else if (Visibilities.isPrivate(declaration.visibility)) { reporter.reportOn(source, FirErrors.EXPECTED_PRIVATE_DECLARATION, context) } - if (declaration is FirSimpleFunction && declaration.hasBody) { + if (declaration is FirFunction && declaration.hasBody) { reporter.reportOn(source, FirErrors.EXPECTED_DECLARATION_WITH_BODY, context) } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/headerClassWithFunctionBody.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/headerClassWithFunctionBody.fir.kt index a7c28e57df7..3f11a23db9c 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/headerClassWithFunctionBody.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/headerClassWithFunctionBody.fir.kt @@ -5,11 +5,11 @@ val constructorProperty: String, constructorParameter: String ) { - init { + init { "no" } - constructor(s: String) { + constructor(s: String) { "no" }