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
|
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
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) {
|
private fun checkProperty(containingDeclaration: FirRegularClass, property: FirProperty, reporter: DiagnosticReporter) {
|
||||||
if (inInterface(containingDeclaration) &&
|
if (containingDeclaration.isInterface &&
|
||||||
property.visibility == Visibilities.Private &&
|
Visibilities.isPrivate(property.visibility) &&
|
||||||
!property.isAbstract &&
|
!property.isAbstract &&
|
||||||
(property.getter == null || property.getter is FirDefaultPropertyAccessor)
|
(property.getter == null || property.getter is FirDefaultPropertyAccessor)
|
||||||
) {
|
) {
|
||||||
property.source?.let { source ->
|
property.source?.let {
|
||||||
reporter.report(source, FirErrors.PRIVATE_PROPERTY_IN_INTERFACE)
|
reporter.report(it, FirErrors.PRIVATE_PROPERTY_IN_INTERFACE)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (property.isAbstract) {
|
if (property.isAbstract) {
|
||||||
if (!containingDeclaration.isAbstract && !containingDeclaration.isSealed && !inEnumClass(containingDeclaration)) {
|
if (!containingDeclaration.canHaveAbstractDeclaration) {
|
||||||
property.source?.let { source ->
|
property.source?.let {
|
||||||
reporter.report(source, FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS)
|
reporter.report(it, FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (property.delegate != null) {
|
if (property.delegate != null) {
|
||||||
property.delegate!!.source?.let {
|
property.delegate!!.source?.let {
|
||||||
if (inInterface(containingDeclaration)) {
|
if (containingDeclaration.isInterface) {
|
||||||
reporter.report(FirErrors.DELEGATED_PROPERTY_IN_INTERFACE.on(it, property.delegate!!))
|
reporter.report(FirErrors.DELEGATED_PROPERTY_IN_INTERFACE.on(it, property.delegate!!))
|
||||||
} else {
|
} else {
|
||||||
reporter.report(FirErrors.ABSTRACT_DELEGATED_PROPERTY.on(it, property.delegate!!))
|
reporter.report(FirErrors.ABSTRACT_DELEGATED_PROPERTY.on(it, property.delegate!!))
|
||||||
@@ -84,7 +83,7 @@ object FirMemberPropertyChecker : FirRegularClassChecker() {
|
|||||||
property.initializer?.source?.let {
|
property.initializer?.source?.let {
|
||||||
if (property.isAbstract) {
|
if (property.isAbstract) {
|
||||||
reporter.report(FirErrors.ABSTRACT_PROPERTY_WITH_INITIALIZER.on(it, property.initializer!!))
|
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!!))
|
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.modality get() = status.modality
|
||||||
inline val FirRegularClass.isSealed get() = status.modality == Modality.SEALED
|
inline val FirRegularClass.isSealed get() = status.modality == Modality.SEALED
|
||||||
inline val FirRegularClass.isAbstract get() = status.modality == Modality.ABSTRACT
|
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.isInner get() = status.isInner
|
||||||
inline val FirRegularClass.isCompanion get() = status.isCompanion
|
inline val FirRegularClass.isCompanion get() = status.isCompanion
|
||||||
inline val FirRegularClass.isData get() = status.isData
|
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.isFromSealedClass: Boolean get() = status.isFromSealedClass
|
||||||
inline val FirMemberDeclaration.isFromEnumClass: Boolean get() = status.isFromEnumClass
|
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.modality get() = status.modality
|
||||||
inline val FirPropertyAccessor.visibility get() = status.visibility
|
inline val FirPropertyAccessor.visibility get() = status.visibility
|
||||||
inline val FirPropertyAccessor.isInline get() = status.isInline
|
inline val FirPropertyAccessor.isInline get() = status.isInline
|
||||||
|
|||||||
Reference in New Issue
Block a user