diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertyChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertyChecker.kt index 5b7d7fe842a..3962225b484 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertyChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMemberPropertyChecker.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext @@ -29,27 +28,27 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { } private fun checkProperty(containingDeclaration: FirRegularClass, property: FirProperty, reporter: DiagnosticReporter) { - if (inInterface(containingDeclaration) && - property.visibility == Visibilities.Private && + if (containingDeclaration.isInterface && + Visibilities.isPrivate(property.visibility) && !property.isAbstract && (property.getter == null || property.getter is FirDefaultPropertyAccessor) ) { - property.source?.let { source -> - reporter.report(source, FirErrors.PRIVATE_PROPERTY_IN_INTERFACE) + property.source?.let { + reporter.report(it, FirErrors.PRIVATE_PROPERTY_IN_INTERFACE) } } if (property.isAbstract) { - if (!containingDeclaration.isAbstract && !containingDeclaration.isSealed && !inEnumClass(containingDeclaration)) { - property.source?.let { source -> - reporter.report(source, FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS) + if (!containingDeclaration.canHaveAbstractDeclaration) { + property.source?.let { + reporter.report(it, FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS) return } } if (property.delegate != null) { property.delegate!!.source?.let { - if (inInterface(containingDeclaration)) { + if (containingDeclaration.isInterface) { reporter.report(FirErrors.DELEGATED_PROPERTY_IN_INTERFACE.on(it, property.delegate!!)) } else { reporter.report(FirErrors.ABSTRACT_DELEGATED_PROPERTY.on(it, property.delegate!!)) @@ -84,7 +83,7 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { property.initializer?.source?.let { if (property.isAbstract) { reporter.report(FirErrors.ABSTRACT_PROPERTY_WITH_INITIALIZER.on(it, property.initializer!!)) - } else if (inInterface(containingDeclaration)) { + } else if (containingDeclaration.isInterface) { reporter.report(FirErrors.PROPERTY_INITIALIZER_IN_INTERFACE.on(it, property.initializer!!)) } } @@ -109,9 +108,4 @@ object FirMemberPropertyChecker : FirRegularClassChecker() { } } - private fun inInterface(containingDeclaration: FirRegularClass): Boolean = - containingDeclaration.classKind == ClassKind.INTERFACE - - private fun inEnumClass(containingDeclaration: FirRegularClass): Boolean = - containingDeclaration.classKind == ClassKind.ENUM_CLASS } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt index 7982410414e..d529963bd32 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirDeclarationUtil.kt @@ -37,10 +37,19 @@ fun FirTypeParameterBuilder.addDefaultBoundIfNecessary(isFlexible: Boolean = fal } } +inline val FirRegularClass.isInterface: Boolean + get() = classKind == ClassKind.INTERFACE + +inline val FirRegularClass.isEnumClass: Boolean + get() = classKind == ClassKind.ENUM_CLASS + inline val FirRegularClass.modality get() = status.modality inline val FirRegularClass.isSealed get() = status.modality == Modality.SEALED inline val FirRegularClass.isAbstract get() = status.modality == Modality.ABSTRACT +inline val FirRegularClass.canHaveAbstractDeclaration: Boolean + get() = isAbstract || isSealed || isEnumClass + inline val FirRegularClass.isInner get() = status.isInner inline val FirRegularClass.isCompanion get() = status.isCompanion inline val FirRegularClass.isData get() = status.isData @@ -71,6 +80,8 @@ inline val FirMemberDeclaration.isLateInit: Boolean get() = status.isLateInit inline val FirMemberDeclaration.isFromSealedClass: Boolean get() = status.isFromSealedClass inline val FirMemberDeclaration.isFromEnumClass: Boolean get() = status.isFromEnumClass +inline val FirFunction<*>.hasBody get() = body != null + inline val FirPropertyAccessor.modality get() = status.modality inline val FirPropertyAccessor.visibility get() = status.visibility inline val FirPropertyAccessor.isInline get() = status.isInline