[FIR] Add EXPOSED_SUPER_(CLASS/INTERFACE) checker
This commit is contained in:
committed by
Mikhail Glukhikh
parent
ef09850df8
commit
49593d308c
+34
-6
@@ -9,12 +9,15 @@ import com.intellij.lang.LighterASTNode
|
||||
import com.intellij.openapi.util.Ref
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiNameIdentifierOwner
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClass
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticFactory3
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeSafe
|
||||
@@ -23,13 +26,38 @@ import org.jetbrains.kotlin.lexer.KtTokens
|
||||
object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>() {
|
||||
override fun check(declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
when (declaration) {
|
||||
is FirTypeAlias -> checkTypeAlias(declaration, context, reporter)
|
||||
is FirProperty -> checkProperty(declaration, context, reporter)
|
||||
is FirFunction<*> -> checkFunction(declaration, context, reporter)
|
||||
is FirTypeAlias -> checkTypeAlias(declaration, reporter)
|
||||
is FirProperty -> checkProperty(declaration, reporter)
|
||||
is FirFunction<*> -> checkFunction(declaration, reporter)
|
||||
is FirRegularClass -> checkSupertypes(declaration, reporter)
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkTypeAlias(declaration: FirTypeAlias, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
private fun checkSupertypes(declaration: FirRegularClass, reporter: DiagnosticReporter) {
|
||||
val classVisibility = declaration.firEffectiveVisibility(declaration.session)
|
||||
val supertypes = declaration.superTypeRefs
|
||||
val isInterface = declaration.classKind == ClassKind.INTERFACE
|
||||
for (supertypeRef in supertypes) {
|
||||
val supertype = supertypeRef.coneTypeSafe<ConeClassLikeType>() ?: continue
|
||||
val clazz = supertype.toRegularClass(declaration.session) ?: continue
|
||||
val superIsInterface = clazz.classKind == ClassKind.INTERFACE
|
||||
if (superIsInterface != isInterface) {
|
||||
continue
|
||||
}
|
||||
val restricting = supertype.leastPermissiveDescriptor(declaration.session, classVisibility)
|
||||
if (restricting != null) {
|
||||
reporter.reportExposure(
|
||||
if (isInterface) FirErrors.EXPOSED_SUPER_INTERFACE else FirErrors.EXPOSED_SUPER_CLASS,
|
||||
restricting,
|
||||
classVisibility,
|
||||
restricting.firEffectiveVisibility(declaration.session),
|
||||
supertypeRef.source ?: declaration.source
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkTypeAlias(declaration: FirTypeAlias, reporter: DiagnosticReporter) {
|
||||
val expandedType = declaration.expandedConeType
|
||||
val typeAliasVisibility = declaration.firEffectiveVisibility(declaration.session)
|
||||
val restricting = expandedType?.leastPermissiveDescriptor(declaration.session, typeAliasVisibility)
|
||||
@@ -44,7 +72,7 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
||||
}
|
||||
}
|
||||
|
||||
private fun checkFunction(declaration: FirFunction<*>, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
private fun checkFunction(declaration: FirFunction<*>, reporter: DiagnosticReporter) {
|
||||
val functionVisibility = (declaration as FirMemberDeclaration).firEffectiveVisibility(declaration.session)
|
||||
if (declaration !is FirConstructor) {
|
||||
val restricting = declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()
|
||||
@@ -78,7 +106,7 @@ object FirExposedVisibilityChecker : FirDeclarationChecker<FirMemberDeclaration>
|
||||
checkMemberReceiver(declaration.receiverTypeRef, declaration as? FirCallableMemberDeclaration<*>, reporter)
|
||||
}
|
||||
|
||||
private fun checkProperty(declaration: FirProperty, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
private fun checkProperty(declaration: FirProperty, reporter: DiagnosticReporter) {
|
||||
val propertyVisibility = declaration.firEffectiveVisibility(declaration.session)
|
||||
val restricting =
|
||||
declaration.returnTypeRef.coneTypeSafe<ConeKotlinType>()?.leastPermissiveDescriptor(declaration.session, propertyVisibility)
|
||||
|
||||
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||
import org.jetbrains.kotlin.psi.KtParameter
|
||||
import org.jetbrains.kotlin.psi.KtSuperTypeListEntry
|
||||
import org.jetbrains.kotlin.psi.KtTypeReference
|
||||
|
||||
object FirErrors {
|
||||
@@ -58,6 +59,8 @@ object FirErrors {
|
||||
val EXPOSED_RECEIVER_TYPE by error3<FirSourceElement, KtTypeReference, FirEffectiveVisibility, DeclarationWithRelation, FirEffectiveVisibility>()
|
||||
val EXPOSED_PROPERTY_TYPE by error3<FirSourceElement, PsiElement, FirEffectiveVisibility, DeclarationWithRelation, FirEffectiveVisibility>()
|
||||
val EXPOSED_PARAMETER_TYPE by error3<FirSourceElement, KtParameter, FirEffectiveVisibility, DeclarationWithRelation, FirEffectiveVisibility>()
|
||||
val EXPOSED_SUPER_INTERFACE by error3<FirSourceElement, KtSuperTypeListEntry, FirEffectiveVisibility, DeclarationWithRelation, FirEffectiveVisibility>()
|
||||
val EXPOSED_SUPER_CLASS by error3<FirSourceElement, KtSuperTypeListEntry, FirEffectiveVisibility, DeclarationWithRelation, FirEffectiveVisibility>()
|
||||
|
||||
val REPEATED_MODIFIER by error1<FirSourceElement, PsiElement, KtModifierKeywordToken>()
|
||||
val REDUNDANT_MODIFIER by error2<FirSourceElement, PsiElement, KtModifierKeywordToken, KtModifierKeywordToken>()
|
||||
|
||||
Reference in New Issue
Block a user