FIR: utilize lookups of certain properties of classes/functions
This commit is contained in:
committed by
Mikhail Glukhikh
parent
ec68ac36db
commit
3af820eaf4
+9
-15
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user