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 cdf890d7ff2..e5b0e4ac35c 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 @@ -11,10 +11,13 @@ import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.valOrVarKeyword import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor import org.jetbrains.kotlin.fir.declarations.utils.hasBody import org.jetbrains.kotlin.fir.declarations.utils.isExpect +import org.jetbrains.kotlin.fir.declarations.utils.isInline import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall @@ -39,6 +42,9 @@ object FirExpectConsistencyChecker : FirBasicDeclarationChecker() { getConstructorDelegationCall(declaration)?.let { delegatedConstructor -> reporter.reportOn(delegatedConstructor.source, FirErrors.EXPECTED_CLASS_CONSTRUCTOR_DELEGATION_CALL, context) } + for (propertyParameter in getConstructorProhibitedPropertyParameters(declaration, lastClass)) { + reporter.reportOn(propertyParameter.source, FirErrors.EXPECTED_CLASS_CONSTRUCTOR_PROPERTY_PARAMETER, context) + } if (isProhibitedEnumConstructor(declaration, lastClass)) { reporter.reportOn(source, FirErrors.EXPECTED_ENUM_CONSTRUCTOR, context) } @@ -52,6 +58,18 @@ object FirExpectConsistencyChecker : FirBasicDeclarationChecker() { } } + private fun getConstructorProhibitedPropertyParameters( + declaration: FirMemberDeclaration, + containingClass: FirClass?, + ): List { + if (declaration is FirPrimaryConstructor && + containingClass != null && containingClass.classKind != ClassKind.ANNOTATION_CLASS && !containingClass.isInline + ) { + return declaration.valueParameters.filter { it.source.valOrVarKeyword != null } + } + return emptyList() + } + private fun getConstructorDelegationCall(declaration: FirMemberDeclaration): FirDelegatedConstructorCall? { if (declaration is FirConstructor) { if (!declaration.isPrimary) { diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectedClassConstructorPropertyParameters.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectedClassConstructorPropertyParameters.fir.kt deleted file mode 100644 index 13017409bde..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectedClassConstructorPropertyParameters.fir.kt +++ /dev/null @@ -1,14 +0,0 @@ -// DIAGNOSTICS: -NO_ACTUAL_FOR_EXPECT -// MODULE: m1-common -// FILE: common.kt -expect class Foo( - val constructorProperty: String, - var constructorVar: String, - constructorParameter: String, -) { - constructor(val notReported: String) -} - -expect annotation class Ann(val s: String) - -expect value class ValueClass(val s: String) diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectedClassConstructorPropertyParameters.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectedClassConstructorPropertyParameters.kt index 323cc16e1c7..6ae5c4b1f2c 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectedClassConstructorPropertyParameters.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectedClassConstructorPropertyParameters.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // DIAGNOSTICS: -NO_ACTUAL_FOR_EXPECT // MODULE: m1-common // FILE: common.kt